写一个可重入锁的案例
时间: 2024-02-25 07:56:06 浏览: 21
下面是一个使用可重入锁的案例,实现了一个线程安全的计数器,支持多线程并发操作:
```java
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private final ReentrantLock lock = new ReentrantLock();
private int count = 0;
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
public void decrement() {
lock.lock();
try {
count--;
} finally {
lock.unlock();
}
}
public int getCount() {
lock.lock();
try {
return count;
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
ReentrantLockExample counter = new ReentrantLockExample();
Runnable task = () -> {
for (int i = 0; i < 10000; i++) {
counter.increment();
}
};
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(counter.getCount()); // 输出20000
}
}
```
在上面的案例中,我们使用了可重入锁来保证多个线程并发访问计数器时的线程安全性。其中,`lock()`方法用于获取锁,`unlock()`方法用于释放锁,`try-finally`语句用于保证锁的正确释放,`increment()`和`decrement()`方法分别用于增加和减少计数器的值,`getCount()`方法用于获取当前计数器的值。在`main()`方法中,我们启动了两个线程并发地对计数器进行增加操作,最后输出计数器的值,可以看到输出结果为20000,说明可重入锁确实保证了线程安全性。