reentrantlock默认什么锁
时间: 2023-05-01 18:05:12 浏览: 65
ReentrantLock是一种可重入锁,指同一个线程可以多次获得该锁而不会被阻塞,也可以释放多次锁而不会出现异常。它是Java中的一种实现,可以实现线程间共享资源的同步控制。与synchronized相比,ReentrantLock具有可中断锁获取、公平锁、锁超时等功能。
相关问题
ReentrantLock支持公平锁吗
ReentrantLock是Java中的一个锁实现类,它支持公平锁和非公平锁两种模式。公平锁是指多个线程按照申请锁的顺序来获取锁,而非公平锁则允许线程插队获取锁。在ReentrantLock中,默认情况下是非公平锁。
在使用ReentrantLock时,可以通过构造函数来指定是否使用公平锁。如果使用公平锁,可以将fair参数设置为true;如果使用非公平锁,则将fair参数设置为false或者不传入该参数,默认为非公平锁。
使用公平锁可以保证线程获取锁的顺序与线程申请锁的顺序一致,避免了饥饿现象,但是会带来一定的性能损失。而非公平锁则可能导致某些线程一直无法获取到锁,但是相对于公平锁来说,性能更高。
reentrantlock的公平锁和非公平锁
ReentrantLock 提供了两种锁的公平性选择:公平锁(fair lock)和非公平锁(non-fair lock)。
1. 公平锁(fair lock):公平锁是指多个线程按照请求锁的顺序来获取锁。当一个线程请求锁时,如果锁是可用的,那么它会立即获得锁。如果锁已经被其他线程持有,那么该线程会被放入等待队列中,按照先进先出(FIFO)的顺序等待锁的释放。公平锁保证了所有线程都有公平竞争获取锁的机会,避免了饥饿现象。
要创建一个公平锁,可以在创建 ReentrantLock 对象时传入 true 参数:
```java
ReentrantLock lock = new ReentrantLock(true); // 创建一个公平锁
```
2. 非公平锁(non-fair lock):非公平锁是指多个线程获取锁的顺序是不确定的,可能会导致某些线程连续多次获取到锁,而其他线程一直无法获取到锁。非公平锁相比于公平锁具有更高的吞吐量,因为它减少了线程切换的开销。
要创建一个非公平锁,可以在创建 ReentrantLock 对象时不传入任何参数(默认即为非公平锁):
```java
ReentrantLock lock = new ReentrantLock(); // 创建一个非公平锁
```
在大多数情况下,默认的非公平锁能够提供较好的性能。如果您希望保证线程获取锁的公平性,可以选择使用公平锁。需要注意的是,公平锁的性能可能会相对较低,因为它需要维护等待队列中线程的顺序。