锁的升级 四种状态

锁的升级
无锁:
偏向锁:涉及锁撤销,会一定程度消耗资源,JVM 启动会出现多线程竞争,默认启动时延4秒(但不偏向线程(匿名偏向));关闭偏向锁;(开启:-xxBaiseLockingStartupDelay=?秒 wait()---->重量级锁
轻量级锁:线程未获取锁,就做简单自旋,等待获取锁,由JVM管理自旋次数。
重量级锁:自己维护等待队列,存放想获取锁的进程,避免长时间自旋,且不消耗CPU资源,交给操作系统os来处理。

无锁 (new对象)-> 偏向锁(在门上贴个名字) -> 自旋锁(多线程抢进行CAS) -> 重量级锁 (人太多了,近队列)

synchronized实现过程
- java代码: synchronized
- monitorenter moniterexit
- 执行过程中自动升级
- lock comxchg 指令(多核的时候用lock,lock锁总线CAS原子性)

缓冲行cache line
内存块(64字节)
cpu乱序执行

volatile关键字
1、保证线程可见性
2、禁止指令重排序
3、JVM的内存屏障
屏障两边的执行不可以重排!保障有序!
五成实现:
1、java源码 volatile int i
2、ByteCode字节码 ACC_VOLATILE
3、JVM虚拟机规范 JVM内存屏障
4、Hotspot实现 汇编语言调用
5、CPU级别 MESI 原语支持 总线锁

强引用
软引用(内存不够用了,回收软引用)
弱引用(垃圾回收器看到就回收)
虚引用(管理堆外内存,零拷贝)
本文详细阐述了Java中锁的升级过程,从无锁到偏向锁,再到自旋锁和重量级锁,以及synchronized的实现原理,涉及内存屏障、volatile关键字和引用类型对内存管理的影响。
172万+

被折叠的 条评论
为什么被折叠?



