📅  最后修改于: 2023-12-03 15:04:52.864000             🧑  作者: Mango
ReentrantLock
是 Java 提供的一种可重入锁,与 synchronized
关键字类似,但具有更多的扩展性和灵活性。使用 ReentrantLock
可以更加精确地实现锁的控制,确保线程的安全。
以下是 ReentrantLock
的几个特性:
synchronized
相同,ReentrantLock
也支持重入,同一个线程可以重复获取同一把锁。ReentrantLock
可以被设置为公平锁或非公平锁。公平锁保证获取锁的顺序按照线程的到达时间有序进行,而非公平锁则没有这个保证,可能会导致某些线程长时间无法获得锁。ReentrantLock
可以绑定多个条件,这些条件可以在不同的线程之间协调通信。以下是一个使用 ReentrantLock
的例子:
import java.util.concurrent.locks.ReentrantLock;
public class MutexDemo implements Runnable {
private ReentrantLock lock = new ReentrantLock();
public void run() {
try {
lock.lock();
System.out.println(Thread.currentThread().getName() + "获得了锁");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
System.out.println(Thread.currentThread().getName() + "释放了锁");
}
}
public static void main(String[] args) {
MutexDemo demo = new MutexDemo();
Thread thread1 = new Thread(demo, "Thread-1");
Thread thread2 = new Thread(demo, "Thread-2");
thread1.start();
thread2.start();
}
}
在这个例子中,创建了一个 ReentrantLock
实例 lock
,并使用它保护了一个代码块。在 run
方法中,用 lock.lock()
获取锁,在 finally
块中调用了 lock.unlock()
释放锁。这里使用 try finally
构造是为了确保无论代码是否正常执行,都会及时地释放锁。
ReentrantLock
相对于 synchronized
更加灵活,支持重入、公平锁和非公平锁、多条件等特性。但是,在使用 ReentrantLock
时需要格外小心,避免产生死锁等问题。