1. 程式人生 > >volatile與syschronized的區別

volatile與syschronized的區別

   在Java中的syschronized是執行緒同步的關鍵字,在Java類中的方法和變數或者類中使用了該關鍵字的時候,相當於給他們上了把鎖。

在進行功能執行的時候,一個執行緒中只能訪問該上了鎖後的方法或者變數和類,其他執行緒不能訪問當前執行緒上了鎖的方法或者變數和類,
使用該關鍵字的時候容易造成執行緒阻塞的狀態,使其他執行緒只能等待該上了鎖的執行緒執行完畢後才開始執行。在其他地方呼叫
該關鍵字的時候只能進行讀取的操作,而不能進行寫入的操作。(syschronized關鍵字的優點:可以被編譯器優化,缺點:使用了該關鍵字的變數會造成執行緒阻塞的問題)。

而volatile關鍵字恰恰與它相反,使用了該關鍵字的變數它會自動告訴工作記憶體中的值是不確定的。使用的時候需要從主存中讀取,該關鍵字只能使用在宣告的變數上,而不能使用到其他的地方。在其他地方呼叫該變數的時候可以進行讀寫的操作,它相對於syschronized關鍵字的最大區別在於它不會造成執行緒的阻塞,但是被標記的變數不會被編譯器優化。
volatile關鍵字的使用在這插入圖片描述


到這裡,我們可以理解成為:syschronized關鍵字是一把重量級的鎖,而volatile關鍵字是一把輕量級的鎖。重量級的鎖的使用應該要謹慎,不注意很可能造成執行緒阻塞的問題。