java重入鎖 公平鎖和非公平鎖

2021-09-12 23:37:24 字數 738 閱讀 7100

鎖的重入是指同乙個執行緒可以多次獲取同乙個鎖,synchronize是隱式的可重入鎖,reentrantlock通過**實現了鎖的重入:
final boolean nofairtryacquire(int acquires)

}else if(current==getexclusiveownerthread())

return false;

}

從上面的**中,可以一目了然的發現,當獲取鎖的執行緒與擁有鎖的執行緒是同乙個執行緒時,僅會對狀態進行累加。so easy ,並沒有什麼難度。那接下來我們想一下,如何實現公平所和非公平鎖,上面的**是非公平鎖的實現方式。那如何實現公平鎖那?所謂的公平鎖就是所有獲取鎖的執行緒都要按照「先來後到」的順序獲取鎖。假設執行緒b在阻塞佇列中,等待獲取鎖,如果還有乙個執行緒a在b的前面,那麼b就要讓a先獲取鎖。因此在b嘗試獲取鎖之前,只要判斷一下它是否還有前驅的佇列即可。很easy吧:

final boolean fairtryacquire(int acquires)

}else if(current==getexclusiveownerthread())

return false;

}

公平所和非公平鎖的各自優勢是什麼那?公平鎖很好理解,可以防止出現執行緒飢餓現象,每乙個執行緒都有機會獲取到鎖。非公平鎖可能會導致執行緒飢餓,但是我們一般使用非公平鎖,因為非公平鎖可以減少上下文的切換,提高效率。

公平鎖非公平鎖和可重入鎖(遞迴鎖)

公平鎖非公平鎖 公平鎖 是指多個執行緒按照申請鎖的順序來獲取鎖,類似排隊打飯,先來後到。非公平鎖是指多個執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取鎖,在高併發的情況下,有可能會造成優先順序反轉或者飢餓現象 對reentrantlock而言 通過建構函式指定...

公平鎖和非公平鎖

公平鎖和非公平鎖的不同是發生在乙個新的執行緒搶占乙個鎖的情況下。1.對於非公平鎖,當乙個新的執行緒想要得到乙個鎖,而這時鎖恰好沒有被別的執行緒占有,那麼這時候這個新的執行緒就可以無視其他執行緒在等待佇列中的排隊,而直接獲取這個鎖,而且不用先加入等待佇列。2,公平鎖,就是乙個新的執行緒想要得到乙個鎖,...

公平鎖和非公平鎖

所謂公平鎖指的是哪個執行緒先執行,那就可以先得到鎖。非公平鎖是不管執行緒是否是先執行,上來就直接嘗試占有鎖,如果嘗試失敗,就再採用類似公平鎖那種方式。我們看下reentrantlock 類的原始碼 公平鎖 protected final boolean tryacquire int acquires...