synchronized|synchronized 关键字的分析

synchronized 修饰方法和修饰代码块的区别

synchronized修饰方法时,会在方法头上加上对应的关键字 synchronized同步块时,会使用monitorenter和monitorexit每个对象都有各自的monitor,线程并发访问时需要获取到 monitor 如果是 static 方法,也就是类方法的话,需要获取到对应的 class 对象的 monitor

对象头:
Mark Word —— 默认存储对象的hashCode,分代年龄,锁类型,锁标志位等信息 Class Metadata Address —— 类型指针指向对象的类元数据,JVM通过这个指针确定该对象是哪个类的数据

synchronized|synchronized 关键字的分析
文章图片
image synchronized的四种状态:
1.无锁 2.偏向锁 —— 如果一个线程获得了锁,锁就会进入偏向模式,下次再获取该锁时,只需要检查Mark Word的锁标记为是否为偏向锁,且当前线程的ID是否和Mark Word的ThreadID一样就行,减少了锁的申请操作,适用于竞争很小的场合 3.轻量级锁 —— 偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量锁,适用于线程交替执行同步块 4.重量级锁 —— 同一时间多线程访问同一个锁,就会导致轻量级锁升级为重量级锁

对于锁降级和升级的看法
synchronized是可以升级的,随着竞争,锁可能会升级锁也是可以降级的,当JVM进入安全点(SafePoint)的时候,会检查是否有闲置的Monitor,然后试图进行降级. 降级这个观点只有少数的博客中提到,也只是寥寥几句带过,没有深入的去分析

    推荐阅读