ReentrantLock 锁代码示例
时间: 2023-10-03 13:04:17 浏览: 43
以下是 ReentrantLock 锁的代码示例:
```java
import java.util.concurrent.locks.ReentrantLock;
public class Counter {
private int count = 0;
private ReentrantLock lock = new ReentrantLock();
public void increment() {
lock.lock(); // 获得锁
try {
count++; // 执行操作
} finally {
lock.unlock(); // 释放锁
}
}
public int getCount() {
return count;
}
}
```
在上面的示例中,我们使用 ReentrantLock 类来保护 Counter 类中的 count 变量。在 increment() 方法中,我们首先调用 lock() 方法来获得锁,然后执行 count++ 操作,最后调用 unlock() 方法来释放锁。这样,我们就可以保证 count 变量的线程安全性。
相关问题
ReentrantLock尝试获取锁的代码
在使用ReentrantLock时,可以使用`tryLock()`方法来尝试获取锁。该方法会立即返回一个布尔值,表示是否成功获取锁。
代码示例:
```java
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private ReentrantLock lock = new ReentrantLock();
public void doSomething() {
if (lock.tryLock()) {
try {
// 成功获取锁后执行的代码逻辑
System.out.println(Thread.currentThread().getName() + " acquired the lock");
// 执行其他业务逻辑
} finally {
lock.unlock();
}
} else {
// 未成功获取锁时的处理逻辑
System.out.println(Thread.currentThread().getName() + " failed to acquire the lock");
// 可以选择等待一段时间后重新尝试获取锁,或者执行其他业务逻辑
}
}
public static void main(String[] args) {
ReentrantLockExample example = new ReentrantLockExample();
// 创建多个线程尝试获取锁
for (int i = 0; i < 5; i++) {
new Thread(() -> {
example.doSomething();
}).start();
}
}
}
```
在上述示例中,多个线程通过调用`doSomething()`方法来尝试获取锁。如果线程成功获取到锁,则输出当前线程名称并执行其他业务逻辑;如果未成功获取到锁,则输出当前线程名称并执行其他处理逻辑。
需要注意的是,`tryLock()`方法是非阻塞的,如果锁已经被其他线程占用,当前线程会立即返回false,而不是等待获取锁。这使得我们可以在获取锁失败时进行其他处理,而不是一直等待锁的释放。
另外,`tryLock()`方法还有一个重载版本,可以指定等待时间,在指定的时间内尝试获取锁,若超时仍未获取到锁,则返回false。例如:`tryLock(long timeout, TimeUnit unit)`。
总之,`tryLock()`方法提供了一种灵活的方式来尝试获取锁,并根据返回的结果来进行相应的处理。
java悲观锁示例代码
悲观锁是一种并发控制机制,它假设在并发环境下会发生冲突,因此在访问共享资源之前会先获取锁。Java中的悲观锁可以通过synchronized关键字或者ReentrantLock类来实现。
下面是一个使用synchronized关键字实现悲观锁的示例代码:
```java
public class PessimisticLockExample {
private int count = 0;
private final Object lock = new Object();
public void increment() {
synchronized (lock) {
count++;
}
}
public int getCount() {
synchronized (lock) {
return count;
}
}
}
```
在上面的示例代码中,我们使用了一个私有的Object类型的锁对象lock来实现悲观锁。在increment()方法和getCount()方法中,我们使用synchronized关键字来获取锁,确保在访问count变量时的线程安全性。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_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)