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實現。