Java 可重入锁实现:synchronized 和 ReentrantLock 详解
可重入锁(Reentrant Lock)是一种支持重入的锁,即同一线程可以多次获取该锁而不会发生死锁。
在 Java 中,可以使用 synchronized 关键字和 Lock 接口的 ReentrantLock 类来实现可重入锁。
使用 synchronized 关键字实现可重入锁
synchronized 关键字是 Java 中内置的一种锁机制,它可以用来修饰方法或代码块,保证在同一时间只有一个线程可以进入被修饰的方法或代码块。
当一个线程已经获取了某个对象的锁之后,再次尝试获取该对象的锁时,就可以直接获取,而不会被阻塞。这种机制就是可重入锁的实现。
public class ReentrantLockExample {
public synchronized void outer() {
inner();
}
public synchronized void inner() {
// do something
}
}
在上述代码中,outer() 方法和 inner() 方法都使用了 synchronized 关键字修饰,表示它们是同步方法。当一个线程调用 outer() 方法时,会获取到对象的锁,然后再调用 inner() 方法时,由于已经持有该对象的锁,可以直接进入 inner() 方法而不会被阻塞。
使用 ReentrantLock 类实现可重入锁
ReentrantLock 类提供了与 synchronized 关键字类似的功能,但更加灵活和可控。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private Lock lock = new ReentrantLock();
public void outer() {
lock.lock();
try {
inner();
} finally {
lock.unlock();
}
}
public void inner() {
lock.lock();
try {
// do something
} finally {
lock.unlock();
}
}
}
在上述代码中,使用 ReentrantLock 类来创建一个可重入锁对象,并使用 lock() 方法获取锁,使用 unlock() 方法释放锁。在调用 inner() 方法时,同样需要先获取锁,然后再释放锁。
总结
无论是使用 synchronized 关键字还是 ReentrantLock 类,它们都可以实现可重入锁的功能,保证同一线程可以多次获取锁而不会发生死锁。具体使用哪种方式,可以根据实际需求和场景来选择。
- synchronized 更简洁易用,适合简单的同步需求。
- ReentrantLock 提供更灵活的控制,例如可以设置公平锁和非公平锁,以及使用条件变量等。
原文地址: https://www.cveoy.top/t/topic/qokx 著作权归作者所有。请勿转载和采集!