使用场景
当需要在多线程环境下保证共享资源的安全访问时,可以使用Java中的ReentrantLock来实现线程安全。ReentrantLock是一个可重入的互斥锁,它提供了与synchronized关键字类似的功能,但更加灵活和扩展性强。
下面是一个使用ReentrantLock进行线程安全测试的示例代码:
- import java.util.concurrent.locks.ReentrantLock;
-
-
- public class Singleton04 {
-
- private static int counter = 0;
- private static ReentrantLock lock = new ReentrantLock();
-
- public static void main(String[] args) {
- // 创建多个线程并启动
- for (int i = 0; i < 5; i++) {
- Thread thread = new Thread(new CounterRunnable());
- thread.start();
- }
- }
-
- static class CounterRunnable implements Runnable {
- @Override
- public void run() {
- try {
- // 获取锁
- lock.lock();
- // 执行临界区操作
- for (int i = 0; i < 10000; i++) {
- counter++;
- }
- // 输出结果
- System.out.println("Thread " + Thread.currentThread().getId() + " finished. Counter: " + counter);
- } finally {
- // 释放锁
- lock.unlock();
- }
- }
- }
- }
在上述代码中,我们创建了一个静态的ReentrantLock对象lock作为互斥锁,用于保护共享变量counter的访问。每个线程在执行临界区操作之前,先通过lock.lock()获取锁,然后执行操作,最后通过lock.unlock()释放锁。
运行该示例代码,可以看到多个线程并发地对counter进行自增操作,并输出每个线程结束后的结果。由于使用了ReentrantLock进行同步,保证了对counter的安全访问,不会出现数据错乱或冲突的情况。
需要注意的是,在使用ReentrantLock时,一定要在finally块中调用unlock()方法来确保锁的释放,以防止出现死锁的情况。
总而言之,通过使用ReentrantLock可以实现线程安全的访问共享资源,提供了更灵活和扩展性强的方式来控制多线程的同步。