公平鎖和非公平鎖

公平鎖是指多個線程在等待同一個鎖時,必須按照申請鎖的先後順序來一次獲得鎖。

公平鎖的好處是等待鎖的線程不會餓死,但是整體效率相對低一些;非公平鎖的好處是整體效率相對高一些,但是有些線程可能會餓死或者說很早就在等待鎖,但要等很久纔會獲得鎖。其中的原因是公平鎖是嚴格按照請求所的順序來排隊獲得鎖的,而非公平鎖時可以搶佔的,即如果在某個時刻有線程需要獲取鎖,而這個時候剛好鎖可用,那麼這個線程會直接搶佔,而這時阻塞在等待隊列的線程則不會被喚醒。

公平鎖可以使用new ReentrantLock(true)實現。

悲觀鎖

悲觀鎖是就是悲觀思想,即認爲寫多,遇到併發寫的可能性高,每次去拿數據的時候都認爲別人會修改,所以每次在讀寫數據的時候都會上鎖,這樣別人想讀寫這個數據就會block直到拿到鎖。java中的悲觀鎖就是Synchronized,AQS框架下的鎖則是先嚐試cas樂觀鎖去獲取鎖,獲取不到,纔會轉換爲悲觀鎖,如RetreenLock。

“我們相信人人都可以成爲一個IT大神,現在開始,選擇一條陽光大道,助你入門,學習的路上不再迷茫。這裏是北京尚學堂,初學者轉行到IT行業的聚集地。"

查看原文 >>
相關文章