使用场景
当需要在多线程环境下保证共享资源的安全访问时,可以使用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 {@Overridepublic 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
可以实现线程安全的访问共享资源,提供了更灵活和扩展性强的方式来控制多线程的同步。