天天看點

對于synchronized鎖更新的了解

在jdk1.6之前synchronized重量級鎖的觀念深入人心,之前我也一直以為synchronized時重量級鎖,效率很差,但是前段時間閱讀了Java并發程式設計藝術這本書,才知道jdk1.6之後synchronized引入了鎖更新的機制,synchronized不再是單純的重量級鎖了。

我們可以将鎖分為三類:偏向鎖,輕量級鎖,重量級鎖

此處是一些自己的了解,就不說一些難以了解的話了,若是想要深入了解原理,可以參考Java并發程式設計藝術這本書

偏向鎖:當一個線程來通路一個同步代碼塊時,如果時第一次有線程來通路,那麼鎖的對象的對象頭中會修改一個标志位,意思就是目前鎖處于一個偏向鎖的狀态,而且會偏向這個線程,那麼當這個線程使用完同步資源的時候是不會釋放鎖的,下一次來通路的時候隻需要檢查目前偏向鎖指向的是不是自己就可以了,若是第二個線程來嘗試擷取鎖,會使用cas的方式來嘗試擷取,若是擷取成功,那麼偏向鎖指向的線程則會進行更改,簡單來說偏向鎖就是采用了一種競争時釋放的原則,來盡可能少的擷取和釋放鎖,因為有研究表明,一個同步代碼塊會經常隻被同一個線程通路,是以就有了偏向鎖的實作

輕量級鎖:若是兩個線程同時來競争偏向鎖呢,線程cas擷取鎖失敗,那麼此時就說明目前的鎖存在競争關系,就需要更新為輕量級鎖,未擷取鎖的線程會通過自旋的方式來進行擷取鎖

重量級鎖:當一個線程多次cas仍然沒有擷取鎖,那麼說明目前資源的競争十分激烈,那麼就會膨脹為重量級鎖,所有正在嘗試擷取鎖的線程都會進入阻塞狀态,而新來的線程看到目前競争激烈也會直接阻塞

以上就是我對于synchronized的一些了解,希望得到大家的指正