实现一个可重入锁和不可重入锁

可重入锁,持有锁的线程可以进入任何锁所同步的代码块

不可重入锁:

复制代码
public class Lock {
    private boolean isLock = false;

    /**
     * 同步方法
     */
    public synchronized void lock() throws InterruptedException {
        if (isLock) {
            wait();
        }
        isLock = true;
    }

    // 不能保证我加的锁是我释放的,也就是不能保证一致性
    public synchronized void unLock() {
        isLock = false;
        notify();
    }

}
复制代码

可重入锁

复制代码
public class Lock {
 
    private boolean isLock = false;
    private Thread lockedThread;
    private int lockCount;

    public synchronized void lock() throws InterruptedException {
        Thread currentThread = Thread.currentThread();
        while (isLock && lockedThread != currentThread) {
            wait();
        }
        isLock = true;
        lockedThread = currentThread;
        lockCount++;
    }

    public synchronized void unLock() {
        Thread currentThread = Thread.currentThread();
        // 我的锁只能我来释放,一致性
        if (lockedThread == currentThread) {
            lockCount--;
            if (lockCount == 0) {
                isLock = false;
                lockedThread = null;
            }
            notify();
        }
    }
复制代码

测试:

复制代码
public class LockTest {
    private Lock lock = new Lock();

    private void lockMethod1() throws InterruptedException {
        lock.lock();
        // 进入当前锁所同步的代码块,可重入锁不用等待直接获取锁,不可重入锁需要重新获取锁
        lockMethod2();
        lock.unLock();
    }

    private void lockMethod2() throws InterruptedException {
        lock.lock();
        // doSomeThing
        lock.unLock();
    }
}
复制代码

 

 
posted @   杨岂  阅读(265)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示