ReentrantLock底层
时间: 2023-10-04 21:04:35 浏览: 50
ReentrantLock是Java中的一个可重入锁。它的底层实现是基于AbstractQueuedSynchronizer(AQS)类的。
AQS是Java中实现锁和同步器的基础类,它使用一个FIFO队列来管理锁的获取和释放。在ReentrantLock中,它使用AQS的state来表示当前锁的状态,如果state为0,则表示锁是未锁定状态,如果state为1,则表示锁被某个线程获取。
当一个线程获取锁时,它会调用AQS的acquire方法,如果锁的状态为0,则表示锁是未锁定状态,此时该线程会尝试获取锁,并将锁的状态设置为1。如果锁的状态已经为1,则表示锁已经被其他线程获取,此时该线程会进入等待队列并进行自旋等待,直到锁被释放为止。
当一个线程释放锁时,它会调用AQS的release方法,将锁的状态设置为0,并且唤醒等待队列中的一个线程来获取锁。
ReentrantLock还支持公平锁和非公平锁,公平锁会按照线程请求锁的顺序来分配锁,而非公平锁则是不按照顺序来分配锁,可以通过构造函数来指定锁的类型。同时,ReentrantLock也支持条件变量的使用,可以通过创建一个Condition对象来实现线程之间的等待和唤醒。
相关问题
ReentrantLock底层原理
ReentrantLock是一个可重入锁,实现了Lock接口,并且支持重新进入的特性。当一个线程通过调用lock方法获取了锁之后,如果再次调用lock方法,该线程不会被阻塞,而是增加了重试次数。
在ReentrantLock内部,它维护了一个Sync内部类,该类实现了Lock接口的方法,并且通过调用AQS(AbstractQueuedSynchronizer)的Acquire方法来实现加锁的操作。具体而言,根据ReentrantLock初始化时选择的公平锁或非公平锁,Sync的Lock方法会执行相关的内部类Lock方法,最终会调用AQS的Acquire方法。
因此,ReentrantLock底层的原理是通过Sync内部类的Lock方法调用AQS的Acquire方法来实现加锁操作的。这一过程实现了可重入的特性,使得同一个线程可以多次获取锁而不会被阻塞。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [7-ReentrantLock底层原理分析](https://blog.csdn.net/weixin_45596022/article/details/113817683)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *3* [ReentrankLock的底层原理](https://blog.csdn.net/qq_45974547/article/details/123486390)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
reentrantlock的底层原理?
ReentrantLock是Java中用于同步线程的一个类,它的底层原理是基于AQS(AbstractQueuedSynchronizer)实现的。AQS是一个提供了同步器框架的抽象类,ReentrantLock通过继承AQS来实现同步功能。
在ReentrantLock中,主要有两个核心属性:state和exclusiveOwnerThread。state表示锁的状态,用于记录锁的持有数,而exclusiveOwnerThread表示当前持有锁的线程。
在ReentrantLock中,主要有两个核心方法:lock()和unlock()。当一个线程调用lock()方法时,如果锁没有被其他线程持有,该线程会获取到锁并将state加1,并将exclusiveOwnerThread设置为当前线程。如果锁已经被当前线程持有,那么它会增加state的计数器,表示重入次数加1。
在unlock()方法中,会将state减1,并在state为0时释放锁。如果state大于0,表示锁还被其他线程持有,当前线程仍然可以继续持有锁。
另外,ReentrantLock还提供了公平性选择,可以在构造ReentrantLock对象时指定是否为公平锁。公平锁会倾向于将锁授予等待时间最长的线程。
总之,ReentrantLock通过AQS的底层实现来提供可重入的互斥锁,保证线程安全的访问共享资源。