使用 SETNX 实现可重入锁 - Java 代码示例
要实现可重入锁,可以使用一个计数器来记录锁的重入次数,每次加锁时将计数器加 1,解锁时将计数器减 1。只有当计数器为 0 时,表示锁已经完全释放。
以下是一个简单的示例代码,实现了一个可重入锁:
public class ReentrantLock {
private boolean isLocked = false;
private Thread lockedBy = null;
private int lockCount = 0;
public synchronized void lock() throws InterruptedException {
Thread callingThread = Thread.currentThread();
while (isLocked && lockedBy != callingThread) {
wait();
}
isLocked = true;
lockedBy = callingThread;
lockCount++;
}
public synchronized void unlock() {
if (Thread.currentThread() == lockedBy) {
lockCount--;
if (lockCount == 0) {
isLocked = false;
lockedBy = null;
notify();
}
}
}
}
在示例代码中,'isLocked' 表示锁是否被占用,'lockedBy' 表示当前持有锁的线程,'lockCount' 表示锁的重入次数。
在 lock 方法中,首先判断锁是否被占用,并且当前持有锁的线程不是当前线程,如果是,则进入等待状态,直到锁被释放。然后将锁设置为占用状态,将持有锁的线程设置为当前线程,并将锁的重入次数加 1。
在 unlock 方法中,首先判断当前线程是否是持有锁的线程,如果是,则将锁的重入次数减 1,如果锁的重入次数为 0,则表示锁已经完全释放,将锁设置为未占用状态,将持有锁的线程设置为 null,并通知其他等待线程。
使用示例代码可以实现可重入锁的效果,即可以在同一线程中多次获取同一个锁,而不会产生死锁。
原文地址: https://www.cveoy.top/t/topic/qokz 著作权归作者所有。请勿转载和采集!