Java關鍵字系列 — volatile、synchronized、lock
阿新 • • 發佈:2019-01-24
volatile、synchronized和lock是Java應對併發程式設計提出的三個比較常用的關鍵字,下面具體講一下三個關鍵字的特徵、具體應用場景。
volatile
控制層面
記憶體和CPU快取記憶體
控制機制
控制主記憶體和CPU快取記憶體的一致性,當一個執行緒更改了某個記憶體變數時,會強制更新主記憶體,並通知其他CPU從主記憶體中重新獲取變數值。
應用場景
1. 對變數的寫操作不依賴於當前值
2. 該變數沒有包含在具有其他變數的不變式中
補充描述
一旦一個共享變數(類的成員變數、類的靜態成員變數)被volatile修飾之後,那麼就具備了兩層語義:
1. 可見性: 一個執行緒修改了某個變數的值,這新值對其他執行緒來說是立即可見的。
2. 有序性:禁止進行指令重排序
synchronized
控制層面
JVM層面
控制機制
控制某個方法的執行者或者是某個變數的擁有者。如果是方法鎖,則同一時間只能有一個執行緒使用該方法,其他執行緒阻塞;如果是物件所,則哪個執行緒最先擁有鎖物件,則哪個執行緒先執行,其他執行緒阻塞。
應用場景
1. 需要保證系統的原子性
2. 鎖資源競爭不是很激烈
lock
控制層面
CPU匯流排
控制機制
控制執行緒的執行的CPU,在匯流排之下只允許一個執行緒的CPU可以訪問某個記憶體,當某個執行緒執行結束之後其他執行緒才能訪問變數資源
應用場景
1. 需要保證系統的原子性
2. 鎖資源競爭相對較激烈