可重入锁和不可重入锁的区别

可重入锁和不可重入锁的区别不可重入锁示例(同一个线程不可以重入上锁后的代码段)如下是一个不可重入锁的逻辑过程,会发现执行main方法控制台会打印执行doJob方法前,然后就会一直线程阻塞,不会打印执行doJob方法过程中,原因在于第一次上锁后,由于没有释放锁,因此执行第一次lock后isLocked=true,这个时候调用doJob()内部又一次调用了lock()由于上个线程将isLocked=true,导致再次进入的时候就进入死循环。导致线程无法执行System.out.println(“执行doJob方法过程中”);这

大家好,又见面了,我是你们的朋友全栈君。

不可重入锁示例(同一个线程不可以重入上锁后的代码段)

如下是一个不可重入锁的逻辑过程,会发现执行main方法控制台会打印执行doJob方法前,然后就会一直线程阻塞,不会打印执行doJob方法过程中,原因在于第一次上锁后,由于没有释放锁,因此执行第一次lock后isLocked = true,这个时候调用doJob()内部又一次调用了lock()由于上个线程将isLocked = true,导致再次进入的时候就进入死循环。导致线程无法执行System.out.println("执行doJob方法过程中");这行代码,因此控制台只能打印执行doJob方法前。这种现象就造成了不可重入锁

public class Count{ 
   
    MyLock lock = new MyLock();

    public static void main(String[] args) throws InterruptedException { 
   
        new Count().doSomeThing(); // 示例的main方法
    }
    public void doSomeThing() throws InterruptedException { 
   
        lock.lock(); // 第一次上锁
        System.out.println("执行doJob方法前");
        doJob(); // 方法内会再次上锁
        lock.unlock(); // 释放第一次上的锁
    }
    public void doJob() throws InterruptedException { 
   
        lock.lock();
        System.out.println("执行doJob方法过程中");
        lock.unlock();
    }
}

/** * 自定义锁 */
class MyLock{ 
   
    private boolean isLocked = false;
    public synchronized void lock() throws InterruptedException{ 
   
        while(isLocked){ 
   
            wait();
        }
        isLocked = true; // 线程第一次进入后就会将器设置为true,第二次进入是就会由于where true进入死循环
    }
    public synchronized void unlock(){ 
   
        isLocked = false;   // 将这个值设置为false目的是释放锁
        notify();           // 接触阻塞
    }
}

可重入锁示例(同一个线程可以重入上锁的代码段,不同的线程则需要进行阻塞)

java的可重入锁有:ReentrantLock(显式的可重入锁)synchronized(隐式的可重入锁)

可重入锁诞生的目的就是防止上面不可重入锁的那种情况,导致同一个线程不可重入上锁代码段。

目的就是让同一个线程可以重新进入上锁代码段。

设计可重入锁的示例代码

public class MyReentrantLock { 
   
    boolean isLocked = false;   // 默认没有上锁
    Thread lockedBy = null; // 记录阻塞线程
    int lockedCount = 0;    // 上锁次数计数

    /** * 上锁逻辑 */
    public synchronized void lock() throws InterruptedException { 
   
        Thread thread = Thread.currentThread();
        // 上锁了 并且 如果是同一个线程则放行,否则其它线程需要进入where循环进行等待
        while (isLocked && lockedBy != thread) { 
    
            wait();
        }
        isLocked = true; // 第一次进入就进行上锁
        lockedCount++; // 上锁次数计数
        lockedBy = thread; // 当前阻塞的线程
    }

    /** * 释放锁逻辑 */
    public synchronized void unlock() { 
   
        if (Thread.currentThread() == this.lockedBy) { 
   
            lockedCount--; // 将上锁次数减一
            if (lockedCount == 0) { 
   // 当计数为0,说明所有线程都释放了锁
                isLocked = false; // 真正的将释放了所有锁
                notify();
            }
        }
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153260.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 文件管理学习:从百度网盘搬家onedrive测评「建议收藏」

    文件管理学习:从百度网盘搬家onedrive测评「建议收藏」网上已经有很多多家网盘对比的文章了。由于我平时依赖微软系列比较多,常用office,有自己的微软邮箱,科学上网跟吃饭一样(这克服了网页版被qiang的障碍)。所以最后我选择了onedrive,基于上述前提,搬家就是个一蹴而就的事。微软普通账户只有5G免费,要扩容得花钱至少15/月,然后查到了免费扩容的办法,那就是用edu邮箱注册。学校的edu邮箱终于有了用武之处。。用教育邮箱注册office…

    2025年9月3日
    6
  • 各种云服务器性能优秀强大,各家云服务器性能对比

    各种云服务器性能优秀强大,各家云服务器性能对比各家云服务器性能对比内容精选换一换外部镜像文件在从原平台导出前,没有按照“Windows操作系统的镜像文件限制”的要求完成初始化操作,推荐您使用弹性云服务器完成相关配置。流程如图1所示。云服务器的正常运行依赖于XENGuestOSdriver(PVdriver)和KVMGuestOSdriver(UVPVMTools),未安装会对云服务器运行时的性能产生影使用弹性云服务器或者外部…

    2022年5月23日
    39
  • java 缓存 工具类

    java 缓存 工具类

    2022年2月23日
    58
  • 201621123069 《Java程序设计》第5周学习总结

    201621123069 《Java程序设计》第5周学习总结

    2022年3月7日
    37
  • 如何解决虚拟机连不上网「建议收藏」

    如何解决虚拟机连不上网「建议收藏」通常情况下,电脑关机或重启后需要重新连网,但是,虚拟机下的乌班图通常需要重新连网,很多时候找不到之前连接的网络,如果是宽带连接,首先查看虚拟机的设置,将网络适配器改成Net模式(必要时需要重置,然后重启虚拟机),如果还没有出现要连接的以太网,那么就要查看一下主机的服务中的虚拟机是否已经全部开启,如果没有开启,就要将所有和虚拟机有关的服务启动。…

    2022年6月26日
    32
  • 对红黑树的认识总结

    一、对红黑树的基本理解(一)对红黑树的基本定义理解(二)对红黑树是“近似平衡”的理解1.将红色节点从红黑树中去掉,分析包含黑色节点的红黑树的高度2.把红色节点加回去,分析高度变化(三)红黑树与AVL树的比较:二、实现红黑树的基本思想分析(一)理解左旋(rotateleft)、右旋(rotateright)操作(二)插入操作的平衡调整情况一:如果关注节点是a,它的叔叔节点d是红色情况二:如果关注节点是a,它的叔叔节点d是黑色,关注节点

    2022年4月11日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号