synchronized|synchronized 关键字的分析
synchronized 修饰方法和修饰代码块的区别
synchronized修饰方法时,会在方法头上加上对应的关键字
synchronized同步块时,会使用monitorenter和monitorexit每个对象都有各自的monitor,线程并发访问时需要获取到 monitor
如果是 static 方法,也就是类方法的话,需要获取到对应的 class 对象的 monitor
对象头:
Mark Word —— 默认存储对象的hashCode,分代年龄,锁类型,锁标志位等信息
Class Metadata Address —— 类型指针指向对象的类元数据,JVM通过这个指针确定该对象是哪个类的数据
文章图片
image synchronized的四种状态:
1.无锁
2.偏向锁 —— 如果一个线程获得了锁,锁就会进入偏向模式,下次再获取该锁时,只需要检查Mark Word的锁标记为是否为偏向锁,且当前线程的ID是否和Mark Word的ThreadID一样就行,减少了锁的申请操作,适用于竞争很小的场合
3.轻量级锁 —— 偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量锁,适用于线程交替执行同步块
4.重量级锁 —— 同一时间多线程访问同一个锁,就会导致轻量级锁升级为重量级锁
对于锁降级和升级的看法
synchronized是可以升级的,随着竞争,锁可能会升级锁也是可以降级的,当JVM进入安全点(SafePoint)的时候,会检查是否有闲置的Monitor,然后试图进行降级.
降级这个观点只有少数的博客中提到,也只是寥寥几句带过,没有深入的去分析
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量