synchronized加锁原理分析

synchronized加锁原理分析,第1张

个人博客小站欢迎来访:OuChangNing.cn

Monitor java对象头

Mark Word结构:

Monitor:


轻量级锁




锁膨胀


自旋优化


偏向锁

偏向状态:

测试禁用:

偏向锁的撤销

撤销–其他线程使用对象

撤销–调用wait/notify 批量从偏向

批量撤销

锁消除

jvm通过线程逃逸分析发现如果没有线程安全问题会通过即时编译器将该锁消除,提高运行效率。
从jdk 1.7开始已经默认开始逃逸分析,如需关闭,需要指定-XX:-DoEscapeAnalysis
如果没有逃逸(即方法中的对象没有发生逃逸)。

使用逃逸分析编译器可以对代码做如下优化:

  • 同步省略。如果一个对象被发现只能从一个线程被访问到,那么对于这个对象的 *** 作可以不考虑同步。
  • 将堆分配转化为栈分配。如果一个对象在子程序中被分配,要使指向该对象的指针永远不会逃逸,对象可能是栈分配的候选,而不是堆分配。
  • 分离对象或标量替换。有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是存储在CPU寄存器中。
  • 标量替换:在JIT阶段,如果经过逃逸分析,发现一个对象不会被外界访问的话,那么经过JIT优化,就会把这个对象拆解成若干个其中包含的若干个成员变量来代替。这个过程就是标量替换。
  • 栈上分配:如果一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了(对象生命期跟随着线程的生命期,线程结束后对象自动回收)
wait/notif

AIP介绍

wait和notify的正确使用姿势

避免虚假唤醒:

同步模式之保护性暂停


代码实现:


get优化(有超时效果)

异步模式之生产者与消费者

park&nupark


park&nupark之原理


重新理解线程状态转换





线程的活跃性 死锁:



活锁:


ReentrantLock


上一篇:java多线程初始篇

下一篇:共享模型之内存

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/719873.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存