volatile與synchronized的區別

2022-01-29 08:02:28 字數 385 閱讀 5375

volatile本質是在告訴jvm當前變數在暫存器中的值是不確定的,需要從主存中讀取,synchronized則是鎖定當前變數,只有當前執行緒可以訪問該變數,其他執行緒被阻塞住.

volatile僅能使用在變數級別,synchronized則可以使用在變數,方法.

volatile僅能實現變數的修改可見性,但不具備原子特性,而synchronized則可以保證變數的修改可見性和原子性.

volatile不會造成執行緒的阻塞,而synchronized可能會造成執行緒的阻塞.

volatile標記的變數不會被編譯器優化,而synchronized標記的變數可以被編譯器優化.

記住一句話,synchronized很強大,既可以保證可見性,又可以保證原子性,而volatile不能保證原子性!

Volatile與Synchronized的區別

j a執行緒的記憶體模型 j a的執行緒記憶體模型中定義了每個執行緒都有乙份自己的共享變數副本 本地記憶體 裡面存放自己私有的資料,其他執行緒不能直接訪問,而一些共享變數則存在主記憶體中,供所有執行緒訪問。上圖中,如果執行緒a和執行緒b要進行通訊,就要經過主記憶體,比如執行緒b要獲取執行緒a修改後的...

volatile原理與技巧

為什麼使用 volatile 比同步代價更低?同步的代價,主要由其覆蓋範圍決定,如果可以降低同步的覆蓋範圍,則可以大幅提公升程式效能。而volatile 的覆蓋範圍僅僅變數級別的。因此它的同步代價很低。volatile 原理是什麼?volatile 的語義,其實是告訴處理器,不要將我放入工作記憶體,...

重排序與volatile

為了提高編譯器和處理器的能力,對 編譯執行順序進行修改 a和b沒有依賴關係,編譯時可能會是b先執行在執行a int a 1 int b 2 下面由於b依賴於a,所以不會進行重排序 int a 1 int b a 1當乙個執行緒對共享變數進行修改,其他執行緒可以立即知道新的共享變數的值,防止重排序 每...