栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

synchronized加锁原理分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

synchronized加锁原理分析

个人博客小站欢迎来访: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多线程初始篇

下一篇:共享模型之内存

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/825459.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号