- 什么是reentrantlock? Reentrantlock 顾名思义重入锁,表示这个锁是可以重复进入的,你可能要问了,什么情况下才可以重复进入呢? Good question, 重入的意思是:当一个线程持有某个锁的时候,在它没有释放锁之前去干其他的事情,那么当他干完其他的事情之后,它不需要再和其他线程竞争该锁,可以直接获得,这就是重入的意思。
- 为什么要使用Reentrantlock? 使用synchronized 不是更简单吗?为什么还要使用Reentrantlock呢? 是的在大多数情况下这两个锁都可以满足我们。 这就需要分析以下synchronized和Reentrantlock的区别了,先简单的说一下,(因为这个问题如果展开说的话需要重开一个topic)因为Reentrantlock支持公平锁和非公平锁,支持指定获取锁等待的时间避免死锁。
- Reentrantlock底层是如何实现的? 解读Reentrantlock的源码避免不了讲解AQS(AbstractQueuedSynchronizer) 一个CLH锁的java实现。AbstractQueuedSynchronizer中有几个重要的属性state,Node(双向链表);其中state被volatile修饰,表示任意一个线程使用的state的值都是最新的(volatile的可见性),其默认值0,表示没有被线程持有可以获取锁。
Reentrantlock获取锁的大部分逻辑都是AbstractQueuedSynchronizer类中,该类中有一个抽象的方法:tryAcquire,
下面进入Reentrantlock获取锁的具体实现:
以上仅为个人见解,如果有错误欢迎指出。
转载请注明出处。