美文网首页Java 并发
JVM对Synchronized关键字的优化

JVM对Synchronized关键字的优化

作者: Real_man | 来源:发表于2019-03-05 18:29 被阅读45次

Java对象头和Monitor是实现synchronized关键字的基础。

对象头

对象头在内存中的布局:

  • 对象头
  • 实例数据
  • 对齐填充

重点说下对象头,对象头的结构:

  • Mark Word: 默认存储对象的hashcode,分代年龄,锁类型,锁标志位等信息,实现轻量级锁和偏向锁的关键
  • Class Meta Address:类型指针指向对象的类元数据,JVM通过这个指针确定该对象是哪个类的数据

Java中对象在创建的时候就自带了一把Monitor。早期版本中的synchronized依赖mutex lock实现,其底层依赖操作系统的内核态,开销很大,所以早期的加锁性能很低。而后来,HotSpot对synchronized做了很大的优化,现在的效率很不错了。

如:

  • 自适应自旋
  • 锁消除
  • 自旋锁
  • 轻量级锁
  • 锁粗化

参考:Java高效并发(九)

Image result for Java object header

锁升级

Synchonized的四种状态:

  • 无锁
  • 偏向锁,多数情况下,锁不存在竞争,总是由同一线程获得。
  • 轻量级锁,由偏向锁升级来的,第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁
  • 重量级锁,同一时间访问同一把锁,就会有线程获取锁失败,会导致轻量级锁升级为重量级锁
image-20190305082526875 image.png

参考

相关文章

网友评论

    本文标题:JVM对Synchronized关键字的优化

    本文链接:https://www.haomeiwen.com/subject/etnouqtx.html