服務演變之路 單體應用架構 在剛開始的時候,企業的用戶量、數據量規模都⽐較⼩,項⽬所有的功能模塊都放在⼀個⼯程中編碼、編譯、打包並且部署在⼀個Tomcat容器中的架構模式就是單體應用架構,這樣的架構既簡單實用、便於維護,成本⼜低,成為了那個時代的主流架構⽅式。這時候由於業務以及規模都⽐較⼩,所以⽆論 ...
轉自:
http://www.java265.com/JavaMianJing/202205/16535583103522.html
下文筆者講述java中volatile和synchronized的功能和區別簡介說明,如下所示volatile關鍵字功能
被volatile修飾的變數不保留拷貝,直接訪問主記憶體中的。 在Java記憶體模型中,有main memory,每個線程也有自己的memory(如寄存器) 為了性能,一個線程會在自己的memory中保持要訪問的變數的副本 這樣就會出現同一個變數在某個瞬間, 在一個線程的memory中的值可能與另外一個線程memory中的值,或main memory中的值不一致的情況 一個變數聲明為volatile,就意味著這個變數是隨時會被其他線程修改的,因此不能將它cache線上程memory中
synchronized
當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多只有一個線程執行該段代碼 一、當兩個併發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內只能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼塊以後才能執行該代碼塊 二、然而,當一個線程訪問object的一個synchronized(this)同步代碼塊時,另一個線程仍然可以訪問該object中的非synchronized(this)同步代碼塊 三、尤其關鍵的是,當一個線程訪問object的一個synchronized(this)同步代碼塊時,其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞 四、當一個線程訪問object的一個synchronized(this)同步代碼塊時,它就獲得了這個object的對象鎖。結果,其它線程對該object對象所有同步代碼部分的訪問都被暫時阻塞 五、以上規則對其它對象鎖同樣適用