java同步方式

231 阅读2分钟

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队列

为什么叫显式锁?

加锁与解锁是由人为的去控制的饿

synchronized和ReentrantLock类都是互斥锁