ReentrantLock 源码 重入锁 非公平锁 公平锁


构造器 无参构造器使用非公平锁,参数是true时候使用公平锁。



非公平锁 获取锁:首先cas操作修改aqs同步器的state由0改为1,成功后保存当前线程到锁上,表示抢占了锁。抢占失败 调用aqs同步器独占模式获取锁。提供的尝试获取锁的方法:如果AQS的资源数为0则cas操作修改资源数为指定数量,保存当前线程到锁上,获取锁成功,否则 如果当前线程与占有锁的线程是同一个线程,则重入锁,对资源数做相应增量保存,获取锁成功,否则获取锁失败。


公平锁 获取锁:直接调用AQS独占模式获取资源,尝试获取资源:如果当前资源数是0,先判断如果当前aqs线程等待队列中没有等待获取锁的节点,则cas修改资源数为指定资源数,成功后保存当前线程到锁上,获取资源成功。否则判断当前线程是否与独占锁的线程相等,如果相等为重入锁,对当前资源数加上获取的资源数,保存,获取锁成功,否则获取失败。


释放锁:是同一个方法,没有区别:如果当前线程不是持有锁的线程,抛出异常。如果当前资源数-释放资源数为0,设置持有锁的线程为null,更新资源数为0 释放锁成功,如果不是0,则更新资源数为差值 释放锁失败。


ReentrantLock 重入锁 非公平锁 公平锁:使用构造器构造ReentrantLock时候,可以使用参数直到非公平锁和公平锁,无参构造是非公平锁,参数为true可以构造公平锁。非公平获取锁:如果CAS修改AQS资源由0改为1成功,那么把当前线程保存到锁上,获取锁成功返回,否则使用AQS独占模式获取资源。非公平锁提供的尝试获取资源的逻辑:如果当前AQS资源数为0 如果CAS修改AQS资源由0改为1成功,则保存当前线程到锁上,获取锁成功返回,如果当前资源数不是0 进一步判断当前线程与占有锁的线程是是同一个线程,如果是则对AQS资源加1保存,这也就是重入锁的意义,获取锁成功 返回,如果不满足以上2种情况则尝试获取资源失败,在AQS队列等待获取资源。
公平锁获取锁:直接使用AQS独占模式获取资源,它提供的尝试获取资源逻辑:如果当前资源数是0 如果当前AQS线程等待队列没有等待资源的节点,则CAS修改资源由0改为1成功则把当前线程添加到锁,获取锁成功,如果当前资源数不是0 则判断当前线程是否与占有锁的线程是同一个线程是 则为重入锁,对资源加1保存 返回获取锁成功,如果非以上2种情况则尝试获取失败,去AQS线程等待队列等待获取资源。非公平锁会先抢占,抢占不到则在尝试获取资源时候再次抢占,抢占不到去线程等待队列排队。公平锁只有在线程等待队列没有排队的节点时候,才会获取资源,如果有则排队等待。

猜你喜欢

转载自blog.csdn.net/liangwenmail/article/details/81000490