锁的升级 四种状态
锁的升级
无锁:
偏向锁:涉及锁撤销,会一定程度消耗资源,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 原语支持 总线锁
强引用
软引用(内存不够用了,回收软引用)
弱引用(垃圾回收器看到就回收)
虚引用(管理堆外内存,零拷贝)