JAVA多线程之Synchronize 关键字原理

image

众所周知 Synchronize 关键字是解决并发问题常用解决方案,有以下三种使用方式:

  • 同步普通方法,锁的是当前对象。
  • 同步静态方法,锁的是当前 Class 对象。
  • 同步块,锁的是 {} 中的对象。

实现原理:
JVM 是通过进入、退出对象监视器( Monitor )来实现对方法、同步块的同步的。

具体实现是在编译之后在同步方法调用前加入一个 monitor.enter 指令,在退出方法和异常处插入 monitor.exit 的指令。

其本质就是对一个对象监视器( Monitor )进行获取,而这个获取过程具有排他性从而达到了同一时刻只能一个线程访问的目的。

而对于没有获取到锁的线程将会阻塞到方法入口处,直到获取锁的线程 monitor.exit 之后才能尝试继续获取锁。

流程图如下:

image

通过一段代码来演示:

    public static void main(String[] args) { synchronized (Synchronize.class){ System.out.println("Synchronize"); } } 

使用 javap -c Synchronize 可以查看编译之后的具体信息。

public class com.crossoverjie.synchronize.Synchronize { public com.crossoverjie.synchronize.Synchronize(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #2 // class com/crossoverjie/synchronize/Synchronize 2: dup 3: astore_1 **4: monitorenter** 5: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream; 8: ldc #4 // String Synchronize 10: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 13: aload_1 **14: monitorexit** 15: goto 23 18: astore_2 19: aload_1 20: monitorexit 21: aload_2 22: athrow 23: return Exception table: from to target type 5 15 18 any 18 21 18 any } 

可以看到在同步块的入口和出口分别有 monitorenter,monitorexit
指令。

锁优化

synchronize 很多都称之为重量锁,JDK1.6 中对 synchronize 进行了各种优化,为了能减少获取和释放锁带来的消耗引入了偏向锁轻量锁

轻量锁

当代码进入同步块时,如果同步对象为无锁状态时,当前线程会在栈帧中创建一个锁记录(Lock Record)区域,同时将锁对象的对象头中 Mark Word 拷贝到锁记录中,再尝试使用 CASMark Word 更新为指向锁记录的指针。

如果更新成功,当前线程就获得了锁。

如果更新失败 JVM 会先检查锁对象的 Mark Word 是否指向当前线程的锁记录。

如果是则说明当前线程拥有锁对象的锁,可以直接进入同步块。

不是则说明有其他线程抢占了锁,如果存在多个线程同时竞争一把锁,轻量锁就会膨胀为重量锁

解锁

轻量锁的解锁过程也是利用 CAS 来实现的,会尝试锁记录替换回锁对象的 Mark Word 。如果替换成功则说明整个同步操作完成,失败则说明有其他线程尝试获取锁,这时就会唤醒被挂起的线程(此时已经膨胀为重量锁)

轻量锁能提升性能的原因是�:认为大多数锁在整个同步周期都不存在竞争,所以使用 CAS 比使用互斥开销更少。但如果锁竞争激烈,轻量锁就不但有互斥的开销,还有 CAS 的开销,甚至比重量锁更慢。

偏向锁

为了进一步的降低获取锁的代价,JDK1.6 之后还引入了偏向锁。

偏向锁的特征是:锁不存在多线程竞争,并且应由一个线程多次获得锁。

当线程访问同步块时,会使用 CAS 将线程 ID 更新到锁对象的 Mark Word 中,如果更新成功则获得偏向锁,并且之后每次进入这个对象锁相关的同步块时都不需要再次获取锁了。

释放锁

当有另外一个线程获取这个锁时,持有偏向锁的线程就会释放锁,释放时会等待全局安全点(这一时刻没有字节码运行),接着会暂停拥有偏向锁的线程,根据锁对象目前是否被锁来判定将对象头中的 Mark Word 设置为无锁或者是轻量锁状态。

轻量锁可以提高带有同步却没有竞争的程序性能,但如果程序中大多数锁都存在竞争时,那偏向锁就起不到太大作用。可以使用 -XX:-userBiasedLocking=false 来关闭偏向锁,并默认进入轻量锁。

其他优化

适应性自旋

在使用 CAS 时,如果操作失败,CAS 会自旋再次尝试。由于自旋是需要消耗 CPU 资源的,所以如果长期自旋就白白浪费了 CPUJDK1.6加入了适应性自旋:

如果某个锁自旋很少成功获得,那么下一次就会减少自旋。

号外

最近在总结一些 Java 相关的知识点,感兴趣的朋友可以一起维护。

地址: https://github.com/crossoverJie/Java-Interview



作者:crossoverJie
链接:https://www.jianshu.com/p/2ba154f275ea

转载于:https://www.cnblogs.com/PrestonL/p/9507985.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS-数据持久化-第三方框架FMDB的使用

FMDB简单介绍 一、简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象&#xff0c;省去了很多麻烦、冗余的C语言代码 对比苹果自带的Core Data框架&#xff0c;更加轻量级和灵活 提供了多线程安全…

电脑word文档打不开怎么办_word怎么转pdf?两个值得学习的高效转换法

word怎么转pdf&#xff1f;两个值得学习的高效转换法word怎么转pdf&#xff1f;pdf格式是我们经常能够使用到的格式&#xff0c;因为pdf格式在传递的过程中能更好地避免文件出现乱码打不开或误触导致文件被修改的情况。那如果想要把word文件转换成pdf格式以避免阅读word时文件被…

2020双十一实时大屏_2020拼多多双十一,拼多多双十一活动

2020拼多多双十一&#xff0c;拼多多双十一活动&#xff0c;2020拼多多双十一&#xff0c;拼多多双十一活动2020拼多多双十一&#xff0c;拼多多双十一活动拼多多双11来了全球狂欢节先领券再购物低价风暴 震撼来袭没有最低 只有更低拼多多优惠券商城拼多多优惠商城&#xff0c;…

dataTables本地刷新数据解决只能初始化一次问题

2019独角兽企业重金招聘Python工程师标准>>> dataTables的表格只能初始化一次&#xff0c;这样如果需要动态改变表格数据的话就需要写多个表格&#xff0c;这样很显然不是一个好的解决方案。 dataTables Api提供了刷新数据解决方案&#xff1a; 这里大概说一下案例&…

用-force –opengl 指令_苹果新系统ios14新功能汇总 轻点背面等小技巧怎么用

在 iOS 14 以及更新系统中&#xff0c;苹果为 iPhone X 以及更新机型带来了“轻点背面”功能&#xff0c;可以让用户轻点手机背面来实现更多操作&#xff0c;并且这项功能还支持“快捷指令”。例如&#xff0c;如果您不希望应用读取剪贴板中私密内容&#xff0c;可以利用“轻点…

PE文件格式(加密与解密3)(一)

本次的了解主要讲解 PE的基本概念、MS-DOS文件头、PE文件头、区块、输入表、输出表等。 这里我将会结合一个简单的小程序来加深我对PE文件结构的了解。 使用学习工具&#xff1a;有StudyPE、LordPE、PEID。 学习PE建议看书。。和自己动手。。。 PE文件&#xff1a; 在WIN上&…

mysql用户_MySQL用户权限管理详解

用户权限管理主要有以下作用&#xff1a;1. 可以限制用户访问哪些库、哪些表2. 可以限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作3. 可以限制用户登录的IP或域名4. 可以限制用户自己的权限是否可以授权给别的用户一、用户授权mysql> grant all privile…

手把手教Electron+vue的使用

.现如今前端框架数不胜数&#xff0c;尤其是angular、vue吸引一大批前端开发者&#xff0c;在这个高新技术快速崛起的时代&#xff0c;自然少不了各种框架的结合使用。接下来是介绍electronvue的结合使用。 2.Electron是什么&#xff1f;&#xff1f; 对于我来说Electron相当于…

shell循环和分支

循环和分支对代码块的操作是构造组织shell脚本的关键. 循环和分支结构为脚本编程提供了操作代码块的工具.10.1. Loops循环就是重复一些命令的代码块,如果条件不满足就退出循环.for loopsfor arg in [list]这是一个基本的循环结构.它与C的for结构有很大不同.forarg in [list]do …

mysql主从_MySQL主从原理及配置详解

MySQL主从配置及原理&#xff0c;供大家参考&#xff0c;具体内容如下一、环境选择&#xff1a;1.Centos 6.52.MySQL 5.7二、什么是MySQL主从复制MySQL主从复制是其最重要的功能之一。主从复制是指一台服务器充当主数据库服务器&#xff0c;另一台或多台服务器充当从数据库服务…

引导修复 不是活动的_河南省视频数据修复中心

河南省视频数据修复中心 lk6afds河南省视频数据修复中心 文件预览我找到了我要恢复文件&#xff0c;可是&#xff0c;这个文件能能正确恢复呢。没有用的文件不可以删掉吗。我们先来看看盘文件夹都是什么吧。(以下仅限于~系统)一般来说&#xff0c;刚刚安装的电脑系统盘主要包含…

企业日志分析 五大问题需重点注意

资讯 | 安全 | 论坛 | 下载 | 读书 | 程序开发 | 数据库 | 系统 | 网络 | 电子书 | 微信学院 | 站长学院 | 源码 | QQ | 专栏 | 考试 | 系统安全| 网站安全| 企业安全| 网络安全| 工具软件| 杀毒防毒| 加密解密|首页 > 安全 > 企业安全 > 正文企业安全…

python学习笔记(一):python入门

上周六终于开始接触心心念念的python了&#xff0c;本人学习语言算是零基础&#xff0c;java语法比较复杂&#xff0c;所以选择了一个语法相对还是比较简单&#xff0c;而且现在使用也是越来越广泛的python进行了学习。下面就言归正传吧 在学习python之前先来了解下现今比较流行…

怎么验证proftpd安装成功_英雄联盟手游泰服安卓账号怎么注册

英雄联盟手游中泰服安卓账号怎么注册&#xff1f;泰服安卓账号的注册流程是怎样的&#xff1f;泰服安卓账号的注册与其他服安卓账号的注册是否一致&#xff1f;接下来就给介绍下手游中泰服安卓账号的注册&#xff0c;希望对各位玩家能有所帮助。英雄联盟游戏新泰服安卓账号怎样…

oracle实现mysql的if_oracle中decode函数 VS mysql中的if函数和case函数

oracle中有decode函数&#xff0c;如下&#xff1a;select sum(decode(sex&#xff0c;男&#xff0c;0,1)) 男生数 from school&#xff1b;统计男生数目&#xff0c;含义为&#xff1a;decode()中sex字段为男时&#xff0c;用1代替&#xff0c;然后计算总和而mysql中没有该函…

visio对象放入word显示不全_办公人士必学visio技能 手把手教你使用visio绘制项目全景图!...

Hi,大家好&#xff01;我是爱踢汪。今天本汪想问问你用什么总结项目&#xff0c;Word、PPT还是视频&#xff1f;下面我们聊聊画图。画图固然是为了好看&#xff0c;视觉上的冲击加深印象。更重要的是&#xff0c;图像模型带来的“潜台词”&#xff0c;有意想不到的效果&#xf…

mongoDB操作详细

简介 它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等 关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念 MongoDB中也同样有以上…

mysql 存储过程 on_MySQL存储过程的权限问题小结

MySQL的存储过程&#xff0c;没错&#xff0c;看起来好生僻的使用场景。问题源于一个开发同学提交了权限申请的工单&#xff0c;需要开通一些权限。本来是一个很正常的操作&#xff0c;但在我来看是比较着急且紧迫的&#xff0c;说来惭愧&#xff0c;忙着方向规划和开发的事情&…

mysql索引引擎_mysql搜索引擎和索引那些事

mysql的存储引擎三种存储方式**InnoDB **(默认)一个文件存储表结构&#xff0c;一个存储数据和目录(索引)# 一个文件 book_name | author| press | price | pub_date frm文件 frame的缩写# 另一个文件(数据 目录)# | 倚天屠龙记 | egon | 北京工业地雷出版社 | 70.00 | 2019-07…

深度ip转换器手机版app_房串串经纪人版app下载-房串串经纪人版app手机版 v1.0.0...

房串串经纪人版app&#xff1a;专门为房产经纪人打造的辅助办公软件&#xff0c;提供的功能非常的全面&#xff0c;涵盖了房产服务过程中的各个环节&#xff0c;随时可以手机在线处理自己的日常工作&#xff0c;提高了工作的效率&#xff0c;操作很简单&#xff0c;让你更好的实…