美文网首页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