Java并发之synchronized

Java多线程同步关键词是常用的多线程同步手段。它可以修饰静态类方法,实例方法,或代码块。修饰static静态方法时是对整个类加锁。

一、实现原理

在JVM中对象内存分三块区域,对象头、实例数据、对齐填充数据。Java对象头是实现synchronize锁对象的基础,它使用的锁对象就是存储在Java对象头里。JVM中用2个字节存储对象头,主要结构是由Mark Word和Class Metadata Address 组成,前者MarkWord里存储对象的hashcode、锁信息、分代年龄、GC标志等信息,后者存放类型指针,指向对象的类元数据。

从字节码可知synchronized代码块的实现用的是mmonitorenter和monitorexit指令,synchronized方法同步是隐式同步,JVM从方法常量池中的方法表结构中的ACC_SYNCHRONIZED访问标志区分一个方法是否是同步方法。

二、JVM锁优化

JAVA6后JVM对同步关键词进行优化,引入偏向锁、自旋锁、轻量级锁等概念。对象头中锁状态有无锁状态、偏向锁、轻量级锁和重量级锁。

JVM在JIT编译时通过上下文扫描,会去除不可能存在共享资源竞争的锁,减少没必要的请求锁时间,比如方法内StringBuffer对象调用append时,JVM会自动将其消除。

JAVA6 默认引入了偏向锁,如果一个线程获取了锁,则锁就进入偏向模式,此时Mark Word的结构也从无锁状态变为偏向锁结构,当这个线程再请求锁时无需做申请锁等相关操作。如果每次申请锁的线程都不相同则不应该用偏向锁。

偏向锁失败后会先升级为轻量级锁,此时对象头Mark Word结构变为轻量级锁结构,适应线程交替执行同步块的场合,轻量级锁使用的依据是“对大部分锁,在整个同步周期内都不存在竞争”。如果存在同一时间访问同一锁的情况,轻量级锁就会失败。

轻量级锁失败后虚拟机为了避免线程真实的在操作系统层面挂起,会进行自旋锁优化手段。它基于大多数情况下线程持有锁的时间都不会太长,JVM让想要获取锁的线程做一会儿空循环如果得到锁就进入临界区,如果失败就在操作层面挂起,升级为重量级锁。

深入理解Java并发之synchronized实现原理

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • synchronized,在java并发编程中它一直都是元老级的角色。但是在大多数时候,如果能使用Lock大家可能...
    miaoLoveCode阅读 1,382评论 7 7
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,868评论 0 11
  • 1术语: CAS:Compare and Swap,比较并设置。用于在硬件层面上提供原子性操作。在 Intel 处...
    kennethan阅读 802评论 0 2
  • 投射:1投射有意外之財收入! 2投射有刷卡錢! 3投射大富大貴認識了讓我賺錢的客人!感賞:1感賞聽到玻哥的宇宙智慧...
    謝奕鋒阅读 208评论 0 0
  • 为李白而写,猜里面有几首李白的作品(笑 剑仙 神鹤飞断壁,天水倒桑田。长虹宇宙,始光乍现,锋芒出收,白日失明。川...
    张間人才阅读 766评论 1 1

友情链接更多精彩内容