synchronized关键字(jvm的内置锁,又叫隐式锁)
synchronized锁的膨胀升级
偏向锁:用来处理同一个时间只有一个线程访问同步块的场景
轻量级锁:用来处理少量线程,线程释放锁时间短的情况,如果锁释放时间较长,锁可能会升级
一般一个线程A执行一个同步块,线程B也要执行这个同步块,这个时候线程B会在同步块内部自旋,等在线程A释放锁,线程B通过自旋的次数
判断锁是否要升级
为什么叫隐式锁?
因为加锁和释放锁不需要人为的去控制,jvm自动去搞定
synchronized锁的用法
1.加在方法上面
2.加在静态方法上面
加锁是在类级别上面,如果一个类里面有多个这样的静态方法,他们用的是同一个锁,所以尽量不用
3.加在方法内部的同步块上面
synchronized锁的字节码格式
代码块上
加两个monitorexit是防止代码块出现异常的一个容错处理
方法上
ACC_SYNCHRONIZED表示在执行下面方法的时候要加上内置锁,会自动触发加上monitorenter和monitorexit
对象的不同级别锁模式下hashcode的位置
jvm锁的粗化
逃逸分析前
逃逸分析前后
jvm锁的消除
ReentrantLock类(显式锁)
ReentrantLock由来
ReentrantLock锁的四大核心
1.CAS
依赖于汇编指令:cmpxhg();
2.自旋
3.LocksSuport
4.queue队列
ReentrantLock伪代码
源码解析
exclusiveOwnerThread:当前获取锁的线程是谁
state:表示当前同步器的状态
queue队列
为什么叫显式锁?
加锁与解锁是由人为的去控制的饿