首页 > 其他分享 >可重入锁学习

可重入锁学习

时间:2022-10-16 20:23:31浏览次数:66  
标签:重入 doSomething 学习 获取 死锁 线程 public

转自:https://www.jianshu.com/p/6e8a49121133

1.概念

可重入 就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。锁的操作粒度是”线程”,而不是调用,同一个线程再次进入同步代码的时候.可以使用自己已经获取到的锁,这就是可重入锁。 

2.例子 

 可重入锁也叫递归锁,是指对同一线程而言的。

public class Widget {

        public synchronized void doSomething() {

            ...

        }

}

    public class LoggingWidget extends Widget {

        public synchronized void doSomething() {

            System.out.println(toString() + ": calling doSomething");

            super.doSomething();//若内置锁是不可重入的,则发生死锁        }

}

 子类中要调用父类的方法,再获取一次锁,子类的doSomething方法当前已经获取了,如果调用父类的方法还要再次获取锁,那么就会出现死锁,等待自己释放锁。

可重入锁主要用在线程需要多次进入临界区代码时,需要使用可重入锁。

3.实现原理

为每个锁关联一个获取计数器和一个所有者线程,当计数值为0的时候,这个锁就没有被任何线程持有。

  • 加锁时,需要判断锁是否已经被获取。如果已经被获取,则判断获取锁的线程是否是当前线程。如果是当前线程,则给获取次数加1。如果不是当前线程,则需要等待。
  • 释放锁时,需要给锁的获取次数减1,然后判断,次数是否为0了。如果次数为0了,则需要调用锁的唤醒方法,让锁上阻塞的其他线程得到执行的机会。

 

标签:重入,doSomething,学习,获取,死锁,线程,public
From: https://www.cnblogs.com/BlueBlueSea/p/16796977.html

相关文章

  • chap4的学习心得
    在这一周的学习过程中,我们更加深刻地了解了循环语句的使用,比如99乘法表的输出,输出一个菱形等等,难度更高的题目,在我看来他们都有一个共同的特点,循环套循环。如同if语句中的......
  • 2022-2023-1学期20221417 《计算机基础与程序设计》第7周学习总结
    这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2022-2023-1计算机基础与程序设计第七周作业)......
  • UE4学习笔记6——地形,植被
    P19.地形工具的使用P20.灰度图生成地形P21.植被工具的使用P19地形工具位置地形——管理——新建材质:可以把材质拖进去分段大小:一个中格子里有多少小格子......
  • 2022-2023-1 20221324《计算机基础与程序设计》第七周学习总结
    ##作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WE......
  • 2022-2023-1 20221401 《计算机基础与程序设计》第七周学习总结
    作业信息班级链接:https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK07作业正文:https://www.cnblogs......
  • markdown学习
    #markdown学习一级标题:一个#+空格标题名字一级标题 二级标题:两个##+空格标题名字二级标题 三级标题:三个###+空格标题名字三级标题 四级标题:四......
  • netstat命令学习
    转自:https://segmentfault.com/a/11900000226864301.介绍netstat是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态......
  • Java学习之路01
    基本数据类型byte8位默认值为0short16位默认值为0int32位默认值为0long64位默认值为0Lfloat32位默认值......
  • 参加[直冲"云"霄种子计划训练营]活动AWS-SAA学习心得分享
        首先非常感谢#51CTO#和#亚马逊云科技#提供的#直冲"云"霄种子计划#训练营活动,我是2022年8月初收到一条该活动的短信,然后走流程后荣幸能够加入。经过一段时间的学......
  • JAVAWEB学习——JDBC连接及相关操作
    //加载数据库驱动MySQL://1MySQL驱动:com.mysql.jdbc.Drive//2Oracle驱动:oracle.jdbc.driver.OracleDriver//3SQLS......