公平鎖 和 非公平鎖
公平鎖:類似食堂打飯,按照申請鎖的順序來獲取鎖類似廁所蹲坑先來后到
公平鎖就是很公平 在并發環境下每個線程在獲取鎖的同時會先查看此鎖維護的等待隊列,如果為空,或者當前線程是等待就占有鎖,否則就加入到等待隊列中,以后會按照FIFO的規則從隊列中取到自己
非公平鎖: 多線程獲取鎖的順序并不是按照申請鎖的順序,有可能后申請的線程比先申請的線程優先獲取到鎖,在高并發的情況下可能造成優先級反轉和饑餓現象
非公平鎖上來就嘗試占有鎖,如果占有失敗,在采取類似公平鎖的方式
并發包ReentrantLock的創建可以指定構造函數的boolean類型來得到公平鎖或者非公平鎖 默認是非公平鎖
優勢
非公平鎖的優點在于吞吐量必公平鎖大 對于synchronized而言 也是一種非公平鎖.
可重入鎖(遞歸鎖)
只在同一個線程外層函數獲取鎖后,內層遞歸函數仍然能夠獲取該所得代碼在同一個線程在外層獲取所得時候,進入內層會自動獲取鎖也就是說 線程可以進入任何一個他已經擁有的鎖所同步者的代碼塊
ReentrantLock 和synchronized 典型的可重入鎖 可避免死鎖
自旋鎖
嘗試獲取鎖但是不會立刻阻塞,而是采用循環的方式來嘗試獲取鎖 優點 減少上下文切換 缺點 循環會消耗CPU
類似于 我要向老師問題 但是老師有事在打電話 那我有兩種方式 一種就是一個在那等 阻塞著,一種就是 下去抽根煙一會再回來 如果打完了就問打不完繼續干自己的事 再回來看 一直循環
手寫自旋鎖
less大致思路: 通過CAS操作完成自旋鎖 -- A線程先進來調用myLock方法自己持有5秒鐘 -- B進來后發現當前線程持有鎖不為空 --只能通過自旋等待 -- 直到A釋放鎖后B隨即搶到
獨占鎖(寫)/共享鎖(讀)/互斥鎖/讀寫鎖
獨占鎖:指該鎖一次只能被一個線程所持有。對ReentrantLock和Synchronized而言都是獨占鎖
共享鎖:指該鎖可被多個線程所持有
對ReentrantReadWriteLock其讀鎖是共享鎖,其寫鎖是獨占鎖
讀鎖的共享可保證并發讀是非常高效的,讀寫,寫讀,寫寫的過程是互斥的