1. 程式人生 > 其它 >Java中關鍵字volatile與synchronized的功能及區別

Java中關鍵字volatile與synchronized的功能及區別

轉自:

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物件所有同步程式碼部分的訪問都被暫時阻塞
  五、以上規則對其它物件鎖同樣適用