synchronized加锁原理分析

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

Monitor

java对象头

image.png

Mark Word结构:

image.png

Monitor:

image.png
image.png

轻量级锁

image.png
image.png
image.png
image.png

锁膨胀

image.png
image.png

自旋优化

image.png
image.png

偏向锁

image.png

偏向状态:

image.png

测试禁用:

image.png

偏向锁的撤销

image.png

撤销–其他线程使用对象

image.png

撤销–调用wait/notify

批量从偏向

image.png

批量撤销

image.png

锁消除

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

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

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

wait/notif

image.png

AIP介绍

image.png

wait和notify的正确使用姿势

image.png

避免虚假唤醒:

image.png

同步模式之保护性暂停

image.png
代码实现:
image.png
image.png
get优化(有超时效果)
image.png

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

image.png

park&nupark

image.png
image.png

park&nupark之原理

image.png
image.png

重新理解线程状态转换

image.png
image.png
image.png
image.png
image.png

线程的活跃性

死锁:

image.png
image.png
image.png

活锁:

image.png
image.png

ReentrantLock

image.png
image.png

上一篇:java多线程初始篇

下一篇:共享模型之内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值