java多線程的同步控制一

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

相關文章
相關標籤/搜索