synchronized锁升级过程

(5条消息) 深度剖析 Synchronized 锁升级过程_P@ssW0rd的博客-CSDN博客

synchronized锁升级过程_第1张图片

 synchronized锁升级过程_第2张图片synchronized锁升级过程_第3张图片

synchronized在jdk1.6之后为什么要加入锁升级的机制?

答案:因为在之前的版本中synchronized一定是重量级锁,而重量级锁时需要通过内核态去实现的,而用户态到内核态的切换很费时,但在程序具体执行中synchronized修饰的对象在线程争抢不激烈时并不需要重量级锁,所以加入锁升级机制后,偏向锁和轻量级锁在代码层面就可以解决,不需要进入内核态处理。

 synchronized锁升级过程记录锁状态就是在对象头中

【偏向锁】:

markWord中放的是当前线程指针,所谓的偏向锁是没有必要设计锁竞争机制的,第一个访问这把锁的线程直接把自己的线程ID往上一贴就完了。总而言之是贴上当前线程的标志。

【自旋锁】:
先撤销偏向锁之前贴上的线程标识 ,撤销掉之后进行竞争 ,竞争的方式就是——自旋的竞争 ;

LockRecord

(sychronized是可重入锁,不同重量级记录不一样)

1、偏向锁记录在线程栈里,每增加一次,LR+1,偏向锁、自旋锁 -> 线程栈 -> LR+1 

2、重量级锁 -> ObjectMonitor 字段上。

每个线程在它的线程栈中生成一个LR(锁记录),将这个LR贴到锁上,锁上的指针指向哪一个线程的LR , 就表示哪个线程持有这把锁。另外的线程只能用CAS机制继续竞争。

【重量级锁】:

//我这把锁必须得向操作系统去申请;MarkWord中实际记录的是一个ObjectMoint——实际就是JVM空间写的一个C++对象 , 而这个C++对象它内部去访问的时候是需要通过操作系统,经过操作系统之后拿到操作系统对应的那一把锁。

【synchronized编译过程】:
当我们在Java文件中写了synchronized{…} 代码块之后,在汇编语句中就会出现:
monitorenter——原 { 位置处,锁开始。
monitorexit—–—原 } 位置出,锁结束。
最后一个monitorexit—–—产生任何异常的话。
 

你可能感兴趣的:(JavaEE,java,开发语言)