ReentrantLock锁的原理
时间: 2023-10-04 13:03:01 浏览: 78
ReentrantLock是Java中提供的一种可重入的互斥锁,它是基于AQS(AbstractQueuedSynchronizer)实现的。ReentrantLock的原理可以分为以下几个方面:
1. 可重入性:ReentrantLock允许线程在获取锁的情况下再次获取锁,这就是可重入性。可重入性是通过使用ThreadLocal变量来实现的,每个线程持有一个ThreadLocal变量,用来记录获取锁的次数。
2. 独占模式:ReentrantLock是一种独占模式的锁,即同一时刻只能有一个线程获取到锁。当一个线程获取到锁后,其他线程只能等待该线程释放锁。
3. 公平性:ReentrantLock可以设置公平锁或非公平锁,默认是非公平锁。公平锁会按照线程的获取锁的顺序来获取锁,而非公平锁则不保证获取锁的顺序。公平锁的实现需要等待队列,每个线程都会加入等待队列,等待队列中的线程会按照先进先出的顺序获取锁。
4. AQS:ReentrantLock是基于AQS实现的,AQS是一个抽象的同步器,它提供了一种实现锁和同步器的基础框架。ReentrantLock通过继承AQS的方式来实现锁的功能,AQS中的state变量用来记录锁的状态。
总的来说,ReentrantLock通过使用AQS实现了独占模式的可重入锁,同时还提供了公平锁和非公平锁的选择。
相关问题
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中用于实现可重入锁的一个工具类。它比Java中的synchronized关键字更加灵活,功能更加强大,支持公平锁和非公平锁,提供了更多的锁控制方法。
ReentrantLock的实现原理主要是基于AQS(AbstractQueuedSynchronizer)同步器,使用了类似于CAS(Compare And Swap)的算法来实现多线程之间的同步。
当一个线程请求锁时,如果该锁没有被其他线程占用,则该线程立即获得锁,并且将锁的状态设置为1。如果锁已经被其他线程占用,则该线程会被加入到等待队列中。当锁的占用者释放锁时,等待队列中的线程会被唤醒,重新竞争锁。
ReentrantLock支持可重入锁,即同一个线程可以重复获取锁而不会被阻塞。ReentrantLock内部维护了一个计数器,每当一个线程获取锁时,计数器加1;当该线程释放锁时,计数器减1。只有当计数器为0时,锁才会被释放。
另外,ReentrantLock还支持公平锁和非公平锁。公平锁是指线程获取锁的顺序与线程加入等待队列的顺序一致,而非公平锁则是由系统随机选择一个等待线程获得锁。公平锁的实现需要维护一个等待队列,因此会对性能有一定的影响。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)