要实现可重入锁,可以使用一个计数器来记录锁的重入次数,每次加锁时将计数器加 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,并通知其他等待线程。

使用示例代码可以实现可重入锁的效果,即可以在同一线程中多次获取同一个锁,而不会产生死锁。

使用 SETNX 实现可重入锁 - Java 代码示例

原文地址: https://www.cveoy.top/t/topic/qokz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录