本系列是基于经验设计原型,然后不断优化最终达到和AQS(AbstractQueuedSynchronizer)类似的设计。最终结果不一定和AQS完全一致,基于个人理解会有修改,可以作为理解AQS的不完全参考。
接上篇。本篇主要介绍Condition即条件变量的实现,ReentrantLock中最后一块需要实现的内容。
在实现条件变量之前,考虑一下条件变量的一些特性。
- 条件变量依赖锁,而且是独占锁
- 执行await方法后释放锁,当前线程进入睡眠状态,等待满足条件后被其他线程signal/signalAll唤醒,被唤醒后会尝试重新获取锁
- 唤醒可以选择一个也可以全部
注意第一条特性,条件变量依赖的是独占锁,所以类似读锁这种共享锁是不支持条件变量的,ReentrantReadWriteLock中ReadLock#newCondition的实现是直接抛错。
按照第二条特性,可以得到如下的执行过程
Continue reading “Java并发研究 自己写ReentrantLock和ReentrantReadWriteLock(3)”