本篇记录ReentrantReadWriteLock公平锁和非公平锁的实现。
最开始看了些博客上面都提到了ReentrantReadWriteLock公平锁和非公平锁。于是自己想看看锁是长啥样的。最后看了半天,才明白他们说的锁不是我理解的真正存在的一个lock,而是一种机制,通过一些操作,实现了公平与非公平的机制.。
创建
实现类:
发现其实现类都重写了writerShouldBlock、readerShouldBlock函数返回boolean.里面调用了
AbstractQueuedSynchronizer类(线程同步队列类)的方法询问队列是否还有执行的线程。需要注意的是非公平机制中的writerShouldBlock直接返回的是false
下面我们主要看其writerShouldBlock方法的使用:(重点)
在tryAcquire中:
这里就是其公平和非公平锁的实现:
当一个新线程,首先会将其加入同步队列,其次会调用tryAcquire尝试去执行这个线程。
对于公平锁来说,writerShouldBlock会判断队列是否含还有排队的线程,如果有,返回ture. 不执行新加的线程。
对于非公平锁来说,writerShouldBlock直接返回false,直接执行compareAndSetState------CAS操作(什么是CAS操作)。
在CAS操作中,其回去请求对象锁,如果对象锁被别的线程占据,则自旋。所以不是按队列顺序去执行线程。