Synchronized底层实现逻辑原理解析

什么是同步的

如果一个资源被多个线程共享,我们需要同步线程,以避免资源抢占造成的资源数据混乱。在Java中,synchronized是实现线程同步的关键字。

使用synchronized关键字获取Java对象的锁并保护锁定的代码块。JVM保证只有一个线程可以获得Java对象的锁并同时执行相应的代码块,从而实现线程安全。

使用同步

synchronized关键字可用于装饰三个位置:

  • 在装饰实例方法中,锁定对象是此对象的当前对象。
  • 修饰代码块,即synchronized(object){},lock对象是()中的对象,通常是this或explicit对象。
  • 在修改静态方法时,锁对象是方法区域中的类对象和全局锁。
  • 修改一个类,即直接影响一个类。

根据同步修改的不同位置,实现原理不同。

Synchronized底层实现逻辑原理解析

从反编译的结果中,我们可以看到sync()方法中还有一个标识符。JVM基于此acc_uuusynchronized标识符来实现方法同步,即:

当执行该方法时,JVM调用该指令来检查是否在方法\uuSynchronized identifier上设置了ACC,如果设置了ACC\uSynchronized identifier,则将获得锁对象的监控对象。线程执行方法体后,将释放锁对象的监视器对象。在此期间,其他线程无法获取锁对象的监视器对象。

显然,在线程0完成执行之前,线程1不会开始执行。再次检查字节码信息:

我们可以看到sync()字节码指令中有两条monitorenter和monitorexit指令:

Monitorenter:此指令指示要获取锁定对象的监视器对象。此时,监视器对象中的计数将增加+1。如果监视器已被其他线程获取,则该线程将被阻止,直到count=0,然后再次尝试获取监视器对象。

Monitorexit:此指令指示线程释放锁对象的监视器对象。此时,监视器对象的计数将从-1变为0。其他被阻止的线程可以再次尝试获取锁定对象的监视器对象。

Synchronized底层实现逻辑原理解析

您可以看到,与instance方法一样,sync()方法上还有一个标识符。可以得出结论,同步在实例方法上的实现原理与在静态方法上的实现原理相同,两者都是acc_uuu同步标识符来实现。只是它们锁定了不同的对象。

Original: https://www.cnblogs.com/aishangJava/p/15322856.html
Author: 工程师搁浅
Title: Synchronized底层实现逻辑原理解析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/539019/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java延时队列 示例

    /** * @desc: java 延时队列 思路:使&#x7528…

    Java 2023年5月29日
    073
  • Java SE 多态

    多态数组:数组的定义类型为父类类型,里面保存的实际元素类型为子类类型 public class PloyArray { public static void main(String…

    Java 2023年6月7日
    0180
  • Nginx原理入门教程

    想必大家一定听说过 Nginx,若没听说过它,那么一定听过它的”同行”Apache 吧! Nginx 的产生 Nginx 同 Apache 一样都是一种 W…

    Java 2023年5月30日
    068
  • java jfreechart 时序图横坐标显示,设置步数初始坐标不展示问题解决

    1,选择框架 org.jfree jfreechart 1.5.2 2,问题 我们时间绘制走势图的时候,框架会自动计算间隔,并在横坐标显示出计算之后的日期 但是往往自动计算出来展示…

    Java 2023年5月29日
    064
  • Eclipse快捷键

    Original: https://www.cnblogs.com/kongieg/p/12081240.htmlAuthor: kongiegTitle: Eclipse快捷键

    Java 2023年6月8日
    059
  • 【Java】的四种引用的区别

    强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM 也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强…

    Java 2023年5月29日
    088
  • Python递归遍历目录并删除文件中的前N行

    1 import os 2 3 # 遍历目录下的所有文件 4 def check_file(file_path): 5 os.chdir(file_path) 6 print(os…

    Java 2023年6月7日
    070
  • 整合redis并完成短信验证服务

    添加依赖 com.tencentcloudapi tencentcloud-sdk-java 3.1.509 org.springframework.boot spring-boo…

    Java 2023年6月9日
    0111
  • 抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会

    hello,大家好呀,我是小楼。 最近一个技术群有同学at我,问我是否熟悉Dubbo,这我熟啊~ 他说遇到了一个Dubbo异步调用的问题,怀疑是个BUG,提到BUG我可就不困了,说…

    Java 2023年6月6日
    072
  • 启用Hyper-v后,重启后界面提示 无法完成功能配置,正在撤销更改

    安装docker后,提示需要启用hyper-v,在控制面板中勾选Hyper-v,然后重启,更新快完成就提示无法完成功能配置,正在撤销更改 解决方法 方法1 控制面板一个一个选 方法…

    Java 2023年6月16日
    093
  • SpringBoot集成消息队列

    背景 最近在对公司开发框架进行优化,框架内涉及到多处入库的日志记录,例如登录日志/操作日志/访问日志/业务执行日志,集成在业务代码中耦合度较高且占用业务操作执行时间,所以准备集成相…

    Java 2023年6月15日
    068
  • 数据库系统概论小结(四)【面向考试】

    数据库系统概论小结(四)【面向考试】 第五章 数据库完整性 数据库的完整性指数据的正确性和相容性。 正确性:符合现实世界的描述。 相容性:同一对象在不同表里面是符合逻辑的。 维护完…

    Java 2023年6月16日
    074
  • javaweb实现下载

    实现代码 java代码 package com.kuang.servlet; ​ import javax.servlet.ServletException;…

    Java 2023年6月13日
    061
  • PyScript:让Python在HTML中运行

    大家好,我是DD,已经是封闭在家的第51天了! 最近一直在更新Java新特性和IDEA Tips两个专栏,其他方向内容的动态关注少了。昨天天晚上刷推的时候,瞄到了这个神奇的东西,觉…

    Java 2023年6月9日
    095
  • SpringBoot进阶教程(七十三)整合elasticsearch

    Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使…

    Java 2023年6月8日
    070
  • 【力扣】82. 删除排序链表中的重复元素 II

    存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。 示例 …

    Java 2023年6月8日
    0106
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球