标签:topic 展开 讲解 问题 模板 nod 默认值 apt 释放
1. 什么是reentrantlock?
Reentrantlock 顾名思义重入锁,表示这个锁是可以重复进入的,你可能要问了,什么情况下才可以重复进入呢? Good question, 重入的意思是:当一个线程持有某个锁的时候,在它没有释放锁之前去干的其他的事情,那么当他干完其他的事情之后,它不需要再和其他线程竞争该锁,可以直接获得,这就是重入的意思。
2. 为什么要使用Reentrantlock?
使用synchronized 不是更简单吗?为什么还要使用Reentrantlock呢? 是的在大多数情况下这两个锁都可以满足我们。
这就需要分析以下synchronized和Reentrantlock的区别了,先简单的说一下,(因为这个问题如何需要展开说的话需要重开一个topic)。因为Reentrantlock支持公平锁和非公平锁,支持指定获取锁等待的时间避免死锁。
3. Reentrantlock底层是如何实现的?
解读Reentrantlock的源码避免不了讲解AQS(AbstractQueuedSynchronizer) 一个CLH锁的java实现。AbstractQueuedSynchronizer中有几个重要的属性state,Node(双向链表);其中state被volatile修饰,表示任意一个线程使用的state的值都是最新的(volatile的可见性),其默认值0,表示没有被线程持有可以获取锁。
Reentrantlock内部维护了一个Sync类,这个同步类继承AbstractQueuedSynchronizer
Reentrantlock获取锁的大部分逻辑都是AbstractQueuedSynchronizer类中,该类中有一个抽象的方法:tryAcquire,
这里使用了模板模式(设计模式),
上面我们讲到Reentrantlock支持公平锁和非公平锁从下面代码可以看到是继承了Sync类
FairSync 和NonfairSync里面实现了AbstractQueuedSynchronizer. tryAcquire方法。
下面进入Reentrantlock获取锁的具体实现:
当此处整个获取锁的流程就结束了。上面介绍的非公平锁,那么公平锁是如何实现的呢?
公平锁的实现:
总结:一个图简单总结
以上仅为个人见解,如果有错误欢迎指出。
转载请注明出处。
标签:topic 展开 讲解 问题 模板 nod 默认值 apt 释放
原文地址:https://www.cnblogs.com/walter-heisenberg/p/12685363.html