Synchronized原理分析

简介: JUC学习

加锁和释放锁的原理

现象、时机(内置锁this)、深入JVM看字节码(反编译看monitor指令)

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

public class SynchronizedDemo2 {
    Object object = new Object();
    public void method1() {
        synchronized (object) {
        }
        method2();
    }
    private static void method2() {
    }
}


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

>javac SynchronizedDemo2.java


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

>javap -verbose SynchronizedDemo2.class


得到如下的信息:

image.png

关注红色方框里的monitorentermonitorexit即可。

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

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

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

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

image.png

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

目录
相关文章
|
Web App开发
如何实现一个项目配置多个商户信息付款给对应商户
说明:本帖主要说明如何实现给一个平台配置多个商户的号实现多个商户收款。主要用于没有门店和第三方授权方式 支付宝最终是根据请求过来的appid来判断哪一个商户收款(也就是请求是谁的appid就收款到谁的账号下)    方案一:      1.
1592 12
|
网络协议 安全 物联网
你还在用IPv4?揭秘IPv6的几大神秘优势,这些功能你掌握了吗?未来网络的发展全看它了!
【8月更文挑战第19天】随着IPv4地址资源耗尽,IPv6作为新一代互联网协议标准登场。IPv6提供近乎无限的地址空间(3.4x10^38个地址),简化数据包头部以提高处理效率,引入无状态自动配置机制使设备能快速接入网络,集成IPsec提升安全性,并优化移动性和多宿主支持。这些优势共同推动互联网基础设施升级,迎接未来挑战。
970 0
|
存储 监控 区块链
探索区块链技术在数据安全中的应用
本文深入探讨了区块链技术如何革新数据安全领域,通过其独特的去中心化、不可篡改和透明性特点,为数据安全提供了新的解决方案。我们将从区块链的基本原理出发,分析其在保护数据完整性、增强隐私保护以及提升交易安全性方面的应用,并通过案例研究展示区块链技术在实际场景中的有效性。
|
安全 网络安全 数据安全/隐私保护
第六问:http和https区别与联系
HTTP 和 HTTPS 是现代网络通信中的两种重要协议。HTTP 是明文传输协议,无加密功能;HTTPS 在 HTTP 基础上加入 SSL/TLS 加密层,提供数据加密、身份验证和数据完整性保障。HTTP 适用于非敏感信息传输,如新闻网站;HTTPS 适用于在线支付、账户登录等需要保护用户数据的场景。
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
小程序
小程序如何刷新当前页面
小程序如何刷新当前页面
697 0
|
人工智能 PyTorch API
【奶奶看了都会】Meta开源大模型LLama2部署使用教程,附模型对话效果
就在7月19日,MetaAI开源了LLama2大模型,Meta 首席科学家、图灵奖获得者 Yann LeCun在推特上表示Meta 此举可能将改变大模型行业的竞争格局。一夜之间,大模型格局再次发生巨变。
2055 3
【奶奶看了都会】Meta开源大模型LLama2部署使用教程,附模型对话效果
|
人工智能 自然语言处理 运维
人工智能在IT领域的最新应用和前景
人工智能在IT领域的应用正呈现出日益重要的地位,为企业提供了更高效、智能化的解决方案。从自动化运维到智能客服,从数据分析到决策支持,人工智能正在不断拓展其应用范围。未来,人工智能将继续推动IT领域的创新与变革,但同时也需要充分考虑隐私和伦理问题,确保人工智能的应用能够为企业和社会带来最大的价值。
1018 1
人工智能在IT领域的最新应用和前景
|
SQL JSON 测试技术
第三代api自动化测试框架使用教程(pytest+allure+sql+yaml)
第三代api自动化测试框架使用教程(pytest+allure+sql+yaml)
|
存储 SQL 缓存
AnalyticDB Postgres向量版技术内核
AnalyticDB Postgres向量版纯向量检索在高维人脸检索的场景下,性能是开源milvus的HNSW算法的2倍,IVFSQ8的10倍。
AnalyticDB Postgres向量版技术内核