volatile、synchronized和lock是Java應對并發程式設計提出的三個比較常用的關鍵字,下面具體講一下三個關鍵字的特征、具體應用場景。
volatile
控制層面
記憶體和CPU高速緩存
控制機制
控制主記憶體和CPU高速緩存的一緻性,當一個線程更改了某個記憶體變量時,會強制更新主記憶體,并通知其他CPU從主記憶體中重新擷取變量值。
應用場景
1. 對變量的寫操作不依賴于目前值
2. 該變量沒有包含在具有其他變量的不變式中
補充描述
一旦一個共享變量(類的成員變量、類的靜态成員變量)被volatile修飾之後,那麼就具備了兩層語義:
1. 可見性: 一個線程修改了某個變量的值,這新值對其他線程來說是立即可見的。
2. 有序性:禁止進行指令重排序
synchronized
控制層面
JVM層面
控制機制
控制某個方法的執行者或者是某個變量的擁有者。如果是方法鎖,則同一時間隻能有一個線程使用該方法,其他線程阻塞;如果是對象所,則哪個線程最先擁有鎖對象,則哪個線程先執行,其他線程阻塞。
應用場景
1. 需要保證系統的原子性
2. 鎖資源競争不是很激烈
lock
控制層面
CPU總線
控制機制
控制線程的執行的CPU,在總線之下隻允許一個線程的CPU可以通路某個記憶體,當某個線程執行結束之後其他線程才能通路變量資源
應用場景
1. 需要保證系統的原子性
2. 鎖資源競争相對較激烈
部落格參考:http://www.cnblogs.com/dolphin0520/p/3920373.html