在 Java 并发编程中,我们经常需要处理多线程之间的同步问题。在早期的 Java 版本中,我们可以使用 synchronized 关键字来实现线程的同步。然而,Java 5 引入了一个更强大和灵活的同步机制——ReentrantLock,它提供了与 synchronized 关键字类似的功能,并且还具有更多的特性和优势。
ReentrantLock 是一个可重入的互斥锁,它允许线程在获取锁之后多次进入同步代码块,并且能够在多个代码块之间保持同步状态。与 synchronized 关键字不同,ReentrantLock 提供了更多的灵活性和控制权,可以通过以下方式使用:
-
锁的获取和释放
使用 ReentrantLock,我们可以通过调用 lock() 方法来获取锁,并通过调用 unlock() 方法来释放锁。与 synchronized 关键字不同,ReentrantLock 要求我们显式地获取和释放锁,这使得代码的同步语义更加清晰。 -
公平性
ReentrantLock 提供了公平锁和非公平锁两种模式。在公平模式下,锁会按照线程的获取顺序来分配,即先请求锁的线程会先获取到锁。而在非公平模式下,锁的获取是无序的,不保证按照请求的顺序分配锁。这使得我们可以根据实际需求选择适合的模式。 -
条件变量
ReentrantLock 提供了条件变量(Condition)的支持,它可以方便地实现线程间的通信和协调。通过调用 ReentrantLock 的 newCondition() 方法可以创建一个条件变量,然后我们可以使用 await() 方法来使线程等待某个条件的发生,使用 signal() 或 signalAll() 方法来唤醒等待的线程。
下面是一个使用 Reen