AQS底層原理分析

jucjvm

1)synchronized實踐中的問題:
    鎖的得到、鎖的釋放,不夠靈活--》Lock的出現
性能

2)Lock是一個接口:
    意味着這是一個標準,有不少種實現。 重入鎖,讀寫鎖。
線程

3)ReentrantLock: 
    重入的含義:得到鎖時,再次去得到鎖,只用記錄次數就行,而不會阻塞。
        synchronized 和 ReentrantLock

接口

    重入是爲了解決死鎖問題的。隊列


4)
              AQS

同步

              Sync
        
    公平鎖               非公平鎖        

it


5)ReentrantLock重入互斥鎖
class

6)ReentrantReadWriteLock: 只是讀的話,是不須要加鎖的。 讀多寫少時能夠提高性能。
    只有讀的時候,不會阻塞。 而A線程在寫,B線程想去讀取的時候,就會阻塞。 緣由是: 必須保證B獲取到的值是A寫入的值。
原理

    寫寫、讀寫 就會互斥。 而 讀讀是不會互斥的。jdk

7)ReentrantLock的實現:
    當一個線程競爭鎖的時候,其它線程怎麼辦? 按照咱們以前的理解,必然是阻塞。那麼如何實現的?


    同步隊列。    

8)AQS有2種功能:
    獨佔: 獨佔是互斥。

    共享: 共享就是讀寫鎖。

9)AQS的基本實現:
    維護了一個雙向鏈表。線程競爭失敗時,被封裝爲Node(pre、next)節點加入,Node就是搶佔鎖失敗的線程。
    

10)鎖的基本要素:
    jvm層面的CAS,調用unsafe層面的東西

11)非公平鎖: 容許插隊     公平鎖: 必須按照順序來,不容許插隊。      12)AQS的核心原理:         構造一個雙向鏈表,把要沒有爭搶到鎖的線程放到雙向鏈表裏面。而後再去考慮阻塞的事情。                  park: 就算阻塞的意思                  LockSupport.park()                           Thread.interrupted(); // 返回一中斷標誌,而且復位              head一直指向空的節點,               釋放鎖的原理: lock.unlock() -->將state設置爲0,同時去喚醒下一個節點。      13)state,cas比較,若是是0,則設置爲1,而且本身得到鎖。 其它2個線程則爭奪失敗,而且被封裝爲Node節點放到雙向鏈表中。Park了。               14)ReentrantLock特有的靈活的地方: 指定公平或非公平鎖、分組喚醒線程、中斷等待鎖的線程。         ReentrantLock基於jdk,synchronized是基於jvm實現。                                   

相關文章
相關標籤/搜索