接着上一篇深入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,表明应该进入等待状态;非公平锁 的写操作不管三七二十一,我就是要参与竞争去,谁也拦不住;非公平锁的读操作需要判断等待队列里的头结点是不是写操作(通过是否共享来判断锁类型,读锁是共享的,写锁是独占的)。

本文深入探讨了公平锁(FairSync)和非公平锁(NonfairSync)的源码实现,揭示了它们在读写操作中是否应被阻塞的不同策略。公平锁依据排队顺序决定是否等待,而非公平锁的写操作则无视等待直接竞争,读操作需判断队首是否为写操作。
1917

被折叠的 条评论
为什么被折叠?



