接着上一篇深入WriteLock和ReadLock,我們這篇博客將要揭開公平鎖(FairSync)和非公平鎖(NonfairSync)的神祕面紗。
公平鎖(FairSync)源碼:
/**
* Fair version of Sync
*/
static final class FairSync extends Sync {
private static final long serialVersionUID = -2274990926593161451L;
final boolean writerShouldBlock() {
return hasQueuedPredecessors();
}
final boolean readerShouldBlock() {
return hasQueuedPredecessors();
}
}
非公平鎖(NonfairSync)源碼:
/**
* Nonfair version of Sync
*/
static final class NonfairSync extends Sync {
private static final long serialVersionUID = -8159625535654395037L;
final boolean writerShouldBlock() {
return false; // writers can always barge
}
final boolean readerShouldBlock() {
return apparentlyFirstQueuedIsExclusive();
}
}
可以看到,對於讀和寫操作是否應該被阻塞,公平鎖和非公平鎖採取了不同的策略。公平鎖的策略是判斷它前邊是否有正在等待的線程,如果有,返回true,表明應該進入等待狀態;非公平鎖 的寫操作不管三七二十一,我就是要參與競爭去,誰也攔不住;非公平鎖的讀操作需要判斷等待隊列裏的頭結點是不是寫操作(通過是否共享來判斷鎖類型,讀鎖是共享的,寫鎖是獨佔的)。