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