1.synchronize和Lockhtml
通過測試,在單線程時synchronized的效率仍是很快的,遠遠高於ReentrantLock,但在多線程併發訪問時,ReentrantLock的效率會好的多,若是隻是爲了防止偶爾發生的同步問題,就應該使用synchronized,若是併發執行同步代碼塊的頻率比較高,則應該使用ReentrantLock.java
nomal:0
synchronized:0
reentrantLock:15
mul-synchronized:3765
mul-reentrantLock:3143緩存
主要類圖多線程
關鍵方法實現併發
NonfairSync-lock測試
final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); }
會優先使用compareAndSetState(0, 1)來得到鎖,0表示沒有線程佔據資源,直接搶佔。無論AQS的隊列先進行出,這就是爲何叫作不公平鎖。若是得到不到再走acquire(1),也就是公平鎖的流程。優化
FairSync-lockui
final void lock() { acquire(1); }
acquire(1)爲AQS中的方法,AQS是一個先進先出的隊列。spa
CAS線程
CAS:CAS有三個操做數,內存值,舊的預期值,新值,當且僅當舊的預期值與內存值相同時,將內存值修改成新值。CAS是在向CPU發送指令時添加lock前綴來鎖定總線,後來作了緩存鎖定的優化。
ABA問題:
volatile
當寫volatile變量時,JMM把本地內存刷新到主內存。
當讀volatile變量時,先把本地內存置爲無效,再從主內存中讀取共享變量。
volatile是經過插入內存柵欄,來禁用cpu重排序。
synchronized
JVM實現,
參見:http://www.open-open.com/lib/view/open1352431526366.html