广告
返回顶部
首页 > 资讯 > 精选 >怎样深入理解Java多线程与并发框中的synchronized 关键字
  • 360
分享到

怎样深入理解Java多线程与并发框中的synchronized 关键字

2023-06-05 04:06:36 360人浏览 泡泡鱼
摘要

怎样深入理解Java多线程与并发框中的synchronized 关键字,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Class文件与对象对象头 32位JVM的对象头二、sy

怎样深入理解Java多线程并发框中的synchronized 关键字,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、Class文件与对象

对象头 32位JVM的对象头

二、synchronized 三种应用方式

用于实例对象方法(对象是) 用于静态方法(类是锁) 用于同步代码块(同步代码块是锁)

三、synchronized 底层语义原理

锁:就在对象头中

Java 虚拟机中的同步(Synchronization)基于 进入enter 和 退出exit 监视器(Monitor)对象 实现, 无论是显式同步(有明确的 monitorenter 和 monitorexit 指令,即同步代码块)还是隐式同步都是如此。在 Java 语言中,同步用的最多的地方可能是被 synchronized 修饰的同步方法。同步方法 并不是由 monitorenter 和 monitorexit 指令来实现同步的,而是由方法调用指令读取运行时常量池中方法的 ACC_SYNCHRONIZED 标志来隐式实现的,关于这点,稍后详细分析。下面先来了解一个概念Java对象头,这对深入理解synchronized实现原理非常关键。

对象加锁: 使用 monitorenter 和 monitorexit 指令分别获取控制权和释放控制权。

方法加锁:

方法级的同步是隐式,即无需通过字节码指令来控制的,它实现在方法调用和返回操作之中。JVM可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先持有monitor(虚拟机规范中用的是监视器一词), 然后再执行方法,最后再方法完成(无论是正常完成还是非正常完成)时释放monitor。在方法执行期间,执行线程持有了monitor,其他任何线程都无法再获得同一个monitor。如果一个同步方法执行期间抛 出了异常,并且在方法内部无法处理此异常,那这个同步方法所持有的monitor将在异常抛到同步方法之外时自动释放。

四、JVM对synchronized的优化

背景:Java 6之后,为了减少获得锁和释放锁所带来的性能消耗,引入了 偏向锁 和 轻量级锁。 锁的状态:无锁状态、偏向锁、轻量级锁、重量级锁。 锁从 偏向锁 -> 轻量级锁 -> 重量级锁 的锁升级是单向的、不可逆的,没有 锁降级 这一说。

偏向锁

因此为了减少同一线程获取锁(会涉及到一些CAS操作,耗时)的代价而引入偏向锁。偏向锁的核心思想是,如果一个线程获得了锁,那么锁就进入偏向模式,此时Mark Word 的结构也变为偏向锁结构,当这个线程再次请求锁时,无需再做任何同步操作,即获取锁的过程,这样就省去了大量有关锁申请的操作,从而也就提供程序的性能。

轻量级锁

轻量级锁所适应的场景是 线程交替执行同步块 的场合,如果存在 同一时刻访问同一锁 的场合,就会导致轻量级锁膨胀为重量级锁。

自旋锁

自旋锁是乐观的一种表现,乐观的认为很大概率是能够获得锁的。(根据阿里巴巴Java开发规范:如果每次访问冲突的概率小于 20%,推荐使用乐观锁,否则使用悲观锁。乐观锁的重试次数不得小于3次。)

重入锁

从互斥锁的设计上来说,当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的临界区的资源时,这种情况属于 *重入锁,请求将会成功,在java中synchronized是基于原子性的内部锁机制,是可重入的,因此在一个线程调用synchronized方法的同时在其方法体内部调用该对象另一个synchronized方法,也就是说一个线程得到一个对象锁后再次请求该对象锁,是允许的,这就是synchronized的可重入性。

锁消除

消除锁是虚拟机另外一种锁的优化,这种优化更彻底,Java虚拟机在JIT编译时(可以简单理解为当某段代码即将第一次被执行时进行编译,又称即时编译),通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁,通过这种方式消除没有必要的锁,可以节省毫无意义的请求锁时间,如下StringBuffer的append是一个同步方法,但是在add方法中的StringBuffer属于一个局部变量,并且不会被其他线程所使用,因此StringBuffer不可能存在共享资源竞争的情景,JVM会自动将其锁消除。

五、synchronized关键点

中断与synchronized: 事实上线程的中断操作对于正在等待获取的锁对象的synchronized方法或者代码块并不起作用,也就是对于synchronized来说,如果一个线程在等待锁,那么结果只有两种,要么它获得这把锁继续执行,要么它就保存等待,即使调用中断线程的方法,也不会生效。

看完上述内容,你们掌握怎样深入理解Java多线程与并发框中的synchronized 关键字的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 怎样深入理解Java多线程与并发框中的synchronized 关键字

本文链接: https://www.lsjlt.com/news/241085.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎样深入理解Java多线程与并发框中的synchronized 关键字
    怎样深入理解Java多线程与并发框中的synchronized 关键字,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Class文件与对象对象头 32位JVM的对象头二、sy...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中的volatile关键字
    本篇文章为大家展示了如何深入理解Java多线程与并发框中的volatile关键字,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。概念把对 volatile变量的单个读/写,看成是使用 同一个监视器锁 ...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中的CAS
    如何深入理解Java多线程与并发框中的CAS,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。CAS实现原理CAS 是 CompareAndSwap 的缩写,意思是...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中线程的状态
    本篇文章给大家分享的是有关如何深入理解Java多线程与并发框中线程的状态,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 新建状态(New)万事万物都不是凭空出现的,线程也一...
    99+
    2023-06-05
  • 深入理解Java多线程与并发框(第⑪篇)——线程池参数
    ThreadPoolExecutor线程池线程的创建和销毁都会消耗大量资源,就好像公司每天上午9点工作时就招进一批员工,晚上6点干完活就辞退一批员工,这都会销毁公司大量资源。所以合理利用 “池” 中固定、稳定的线程是非常有必要的。扩展关系T...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中线程和进程的区别
    如何深入理解Java多线程与并发框中线程和进程的区别,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。线程和进程的区别1. 资源调度单位在计算机中,进程是程序运行所...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中的并发辅助工具类
    如何深入理解Java多线程与并发框中的并发辅助工具类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Exchanger 交换器(两线程间的通信)使用场景:用于 有且仅有两个线...
    99+
    2023-06-05
  • 怎么深入理解Java多线程与并发框中的顺序一致性模型
    怎么深入理解Java多线程与并发框中的顺序一致性模型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、竞态条件(Race Condition)计算的正确性取决于 多个线程 执行...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中的队列同步器AQS
    如何深入理解Java多线程与并发框中的队列同步器AQS,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、 AbstractOwnableSynchronizer 抽象的、可...
    99+
    2023-06-05
  • 深入理解Java多线程与并发框(第③篇)——Java内存模型与原子性、可见性、有序性
    一、Java内存模型Java Memory Modle,简称 JMM,中文名称 Java内存模型,它是一个抽象的概念,用来描述或者规范访问内存变量的方式。因为各中计算机的操作系统和硬件不同,方式机制也可能不同,Java内存模型用于屏蔽(适配...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中重排序、屏障指令、as-if-serial规则
    这篇文章将为大家详细讲解有关如何深入理解Java多线程与并发框中重排序、屏障指令、as-if-serial规则,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、重排序前篇文章已经讲了Java...
    99+
    2023-06-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作