所謂公平鎖指的是哪個線程先運行,那就可以先得到鎖。非公平鎖是不管線程是否是先運行,都是隨機獲得鎖的。
公平鎖是一個新的線程想要得到一個鎖,這時候不論鎖是否已經被佔有了,都要先把自己加到等待隊列中,然後等隊列前面的線程都處理完以後,自己才能得到鎖。嚴格按照線程啟動的順序來執行的,不允許其他線程插隊執行的
static final class FairSync extends Sync {
final void lock() {
acquire(1);
}
}
非公平鎖是當一個新的線程想要得到一個鎖,而這時鎖恰好沒有被別的線程佔有,那麼這時候這個新的線程就可以無視其他線程在等待隊列中的排隊,而直接獲取這個鎖,而且不用先加入等待隊列。允許插隊的。
static final class NonfairSync extends Sync {
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
}
ReentrantLock中很明顯可以看到其中同步包括兩種,分別是公平的FairSync和非公平的NonfairSync
默認狀態,使用的ReentrantLock()就是非公平鎖。
public ReentrantLock() {
sync = new NonfairSync();
}
更多內容請關注每日編程,每天進步一點。
閱讀更多 每日編程 的文章