个人博客小站欢迎来访: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多线程初始篇
下一篇:共享模型之内存