一方面了为了更好理解(第一版本,重在理解基础,不是嘛),另一方面也是为了更好地复用前面ReentrantLock的代码(毕竟ReentrantLock其实就是读写锁的写锁,不是嘛),这里的JarryReadWriteLock的API不再与官方的ReentrantReadWriteLock相同,而是做了小小调整。直接调用相关读锁的加解锁API,已经相关写锁的加解锁API。具体看代码部分。
JarryReadWriteLock实现原理既然需要已经确定,并且API也确定了。
那么第二步操作,就是简单思考一下,如何实现。
类成员方面:首先,我们需要一个owner属性,来保存持有写锁的线程对象。
其次,由于写锁是可重入锁,所以我们需要一个readCount来保存重入次数。
然后,由于读锁是可以有多个线程持有的,所以我们需要一个writeCount来保存读锁持有线程数。
最后,我们需要一个waiters属性,来保存那些竞争锁失败后,还在等待(不死不休型)的线程对象。
自定义数据结构: