ReentrantLock用法
时间: 2024-01-12 15:53:24 浏览: 31
ReentrantLock是Java中的一种锁机制,它支持可重入锁和条件变量,并且比synchronized更灵活。ReentrantLock用法如下:
1. 创建ReentrantLock对象
```java
ReentrantLock lock = new ReentrantLock();
```
2. 获取锁
```java
lock.lock();
```
3. 释放锁
```java
lock.unlock();
```
4. 尝试获取锁,如果锁已被其他线程占用,则等待一段时间,如果超时则返回false
```java
boolean tryLock = lock.tryLock(1000, TimeUnit.MILLISECONDS);
```
5. 使用条件变量
```java
Condition condition = lock.newCondition();
condition.await(); //等待条件变量
condition.signal(); //唤醒等待条件变量的线程
```
6. 可以对锁进行中断
```java
lock.lockInterruptibly(); //如果锁已被其他线程占用,则等待锁,可以被中断
```
相关问题
java ReentrantLock使用方法
Java中的ReentrantLock是一个可重入的互斥锁,它提供了与synchronized关键字相似的功能,但更加灵活和强大。下面是ReentrantLock的使用方法:
1. 创建ReentrantLock对象:
```java
ReentrantLock lock = new ReentrantLock();
```
2. 获取锁:
```java
lock.lock(); // 获取锁,如果锁已被其他线程获取,则当前线程会被阻塞,直到获取到锁为止
```
3. 释放锁:
```java
lock.unlock(); // 释放锁,必须在获取锁的代码块结束后调用,否则会导致死锁
```
4. 使用try-finally确保锁的释放:
```java
lock.lock();
try {
// 执行需要同步的代码块
} finally {
lock.unlock(); // 在finally块中释放锁,确保锁的释放
}
```
5. 使用条件变量:
```java
Condition condition = lock.newCondition(); // 创建条件变量
condition.await(); // 当前线程等待条件满足
condition.signal(); // 唤醒一个等待该条件的线程
condition.signalAll(); // 唤醒所有等待该条件的线程
```
6. 可重入性:
ReentrantLock是可重入的,即同一个线程可以多次获取同一个锁而不会发生死锁。例如:
```java
lock.lock();
try {
// 执行需要同步的代码块
lock.lock();
try {
// 执行需要同步的代码块
} finally {
lock.unlock();
}
} finally {
lock.unlock();
}
```
ReentrantLock 使用
ReentrantLock是Java中的一个可重入锁,它提供了与synchronized关键字类似的功能,但更加灵活和强大。下面是ReentrantLock的使用介绍:
1. 创建ReentrantLock对象:
```java
ReentrantLock lock = new ReentrantLock();
```
2. 获取锁:
```java
lock.lock(); // 获取锁,如果锁已被其他线程持有,则当前线程会被阻塞,直到获取到锁为止
```
3. 释放锁:
```java
lock.unlock(); // 释放锁,如果当前线程持有锁,则释放锁;如果当前线程没有持有锁,则会抛出IllegalMonitorStateException异常
```
4. 使用try-finally确保锁的释放:
```java
lock.lock();
try {
// 执行需要同步的代码块
} finally {
lock.unlock(); // 在finally块中释放锁,确保锁的释放
}
```
5. 使用条件变量:
```java
Condition condition = lock.newCondition(); // 创建条件变量
condition.await(); // 当前线程等待,直到其他线程调用signal或signalAll方法唤醒它
condition.signal(); // 唤醒一个等待的线程
condition.signalAll(); // 唤醒所有等待的线程
```
6. 公平锁和非公平锁:
ReentrantLock可以是公平锁或非公平锁,默认情况下是非公平锁。在构造ReentrantLock对象时,可以传入一个boolean参数来指定是否使用公平锁:
```java
ReentrantLock lock = new ReentrantLock(true); // 使用公平锁
ReentrantLock lock = new ReentrantLock(false); // 使用非公平锁
```
7. 其他方法:
- `isHeldByCurrentThread()`:判断当前线程是否持有锁。
- `getHoldCount()`:获取当前线程持有锁的次数。
- `getQueueLength()`:获取等待获取锁的线程数。
- `hasQueuedThreads()`:判断是否有线程在等待获取锁。