天天看點

Java關鍵字系列 — volatile、synchronized、lockvolatilesynchronizedlock

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