首页 > 其他分享 >加锁和释放锁的原理

加锁和释放锁的原理

时间:2024-04-22 20:58:36浏览次数:26  
标签:释放 加锁 monitor Object 计数器 线程 原理 class

深入JVM看字节码,创建如下的代码:

public class SynchronizedDemo2 {
    Object object = new Object();
    public void method1() {
        synchronized (object) {

        }
    }
}
 

使用javac命令进行编译生成.class文件

>javac SynchronizedDemo2.java
 

使用javap命令反编译查看.class文件的信息

>javap -verbose SynchronizedDemo2.class

 

MonitorenterMonitorexit指令,会让对象在执行,使其锁计数器加1或者减1。每一个对象在同一时间只与一个monitor(锁)相关联,而一个monitor在同一时间只能被一个线程获得,一个对象在尝试获得与这个对象相关联的Monitor锁的所有权的时候,monitorenter指令会发生如下3中情况之一:

  • monitor计数器为0,意味着目前还没有被获得,那这个线程就会立刻获得然后把锁计数器+1,一旦+1,别的线程再想获取,就需要等待
  • 如果这个monitor已经拿到了这个锁的所有权,又重入了这把锁,那锁计数器就会累加,变成2,并且随着重入的次数,会一直累加
  • 这把锁已经被别的线程获取了,等待锁释放

monitorexit指令:释放对于monitor的所有权,释放过程很简单,就是讲monitor的计数器减1,如果减完以后,计数器不是0,则代表刚才是重入进来的,当前线程还继续持有这把锁的所有权,如果计数器变成0,则代表当前线程不再拥有该monitor的所有权,即释放锁。

下图表现了对象,对象监视器,同步队列以及执行线程状态之间的关系:

 该图可以看出,任意线程对Object的访问,首先要获得Object的监视器,如果获取失败,该线程就进入同步状态,线程状态变为BLOCKED,当Object的监视器占有者释放后,在同步队列中得线程就会有机会重新获取该监视器。

 

标签:释放,加锁,monitor,Object,计数器,线程,原理,class
From: https://www.cnblogs.com/daitu66/p/18151506

相关文章

  • 混淆原理与实践指南
     引言......
  • 数据库原理第一次实验报告
    目录任务一:(数据库CAP)12345任务二:(数据库GlobalToyz)1234567891011121314151617181920写在最后数据库原理第一次实验报告任务一:(数据库CAP)1创建数据库CAP,包含4张表Customers、Products、Agents和Orders。UseMaster;CREATEDatabaseCAP;UseCAP;CREATETABLECUSTOMERS(......
  • springboot启动原理
     启动类上的注解,会扫描路径下的类进容器进行实例化。这样访问时springmvc的dispa就可以访问到这个类了。newDispatcherServlet(webapplication)springmvc需要一个web容器。这个容器参数,在startTomcat(applicationContext)方法里面传入。 ......
  • Spring Boot 启动原理
    SpringBoot启动原理SpringBoot大大简化了我们的开发配置,节省了大量的时间,确实比较方便。但是对于新手来说,如果不了解个中原理,难免会遇到坑。本文作者将带领大家走近神秘的SpringBoot,一步步破开它的神秘面纱,探索SpringBoot的启动原理。开发任何基于SpringBoot的项目......
  • CAN总线原理_学习
    随着通信技术的发展,现今通信方式和协议五花八门,但CAN通信仍然是车载网络最安全可靠且应用最广的技术之一。过去,汽车通常采用常规的点对点通信方式将电子控制单元及电子装置连接起来,但随着电子设备的不断增加,导线数量也随之增多,采用CAN总线网络结构,可以达到信息共享、......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——服务端注册实现原理分析
    远程过程调用RPC——服务端注册实现原理分析rpcserver代码参考我前一篇博文:https://www.cnblogs.com/zuoyang/p/18146870RPCServer端的RPC代码架构主要由两大部分构成:第一部分是服务方法的注册过程。在这个过程中,我们首先通过调用rpc.Register接口将服......
  • 布隆过滤器原理-原论文解析
    布隆过滤器是由BURTONH.BLOOM在1970年提出的一种哈希方法,用于判断一个元素是否存在于某个集合中。HashSet或其他的数据结构都使用了传统的哈希方法,得到的结果是准确的,而布隆过滤器得到的结果不一定准确,因为它使用了一种近似的哈希算法。那为什么还要使用它呢?因为数据量变......
  • 行人属性AI识别/人体结构化属性AI识别算法的原理及应用场景介绍
    行人属性AI识别技术是一种基于人工智能技术的图像识别技术,通过对行人的图像或视频进行处理和分析,提取出其中的结构化信息,如人体姿态、关键点位置、行人属性(性别、年龄、服装等)等。行人结构化数据分析的方法包括姿态估计、关键点检测、行人属性识别等:姿态估计是指根据行人的姿势......
  • 串口通信原理详解232、422、485,入门必看!
    串口通信原理详解232、422、485,入门必看!混说Linux ​关注他 130人赞同了该文章本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。1.串口通讯串口通讯(SerialCommunication),是指外设和计算机间,通过数据信号线、......
  • WebGIS 瓦片地图引擎实现之——地图瓦片加载计算原理介绍
    WebGIS瓦片地图引擎实现之——地图瓦片加载计算原理介绍ThinkGISGIS背景在蚂蚁搞空间数据可视化,L7地理可视化引擎作者​关注他 65人赞同了该文章.背景1.1地图瓦片之前在地图瓦片技术使用之前,用户使用在线地图,一般都是客户端把将要显示的......