公平鎖與非公平鎖

所謂公平鎖指的是哪個線程先運行,那就可以先得到鎖。非公平鎖是不管線程是否是先運行,都是隨機獲得鎖的。

公平鎖與非公平鎖

公平鎖是一個新的線程想要得到一個鎖,這時候不論鎖是否已經被佔有了,都要先把自己加到等待隊列中,然後等隊列前面的線程都處理完以後,自己才能得到鎖。嚴格按照線程啟動的順序來執行的,不允許其他線程插隊執行的

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();

}

更多內容請關注每日編程,每天進步一點。


分享到:


相關文章: