ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

synchronized优化

2022-03-02 16:04:44  阅读:172  来源: 互联网

标签:synchronized 对象 CAS 线程 偏向 自旋 优化 轻量级


Java HotSpot虚拟机中,每个对象都有对象头(包括class指针和Mark Word)。Mark Word 平时存储这个对象的哈希码、分代年龄,当加锁时,这些信息就根据情况被替换为标记位、线程锁记录指针、重量级锁指针、线程ID等内容。

1、轻量级锁

如果一个对象虽然有多线程访问,但多线程访问的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。

每个线程的栈帧中都会包含一个锁记录的结构,内部可以存储锁定对象的Mark Word(8个字节)

MarkWord:

​ 01 无锁

​ 00 轻量级锁

​ 10 重量级锁

2、锁膨胀

如果在尝试加轻量级锁的过程中,CAS操作无法成功,这时一种情况就说有其它线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。

3、重量级锁

重量级锁竞争的时候,还可以使用自旋来进行优化,如果当前线程自旋成功(即这时候持锁线程已经退出了同步块,释放了锁),这时当前线程就可以避免阻塞。

在Java6之后自旋锁是自适应的,比如对象刚刚的一次自旋操作成功过,那么认为这次自旋成功的可能性会高,就多自旋几次;反之,就少自旋甚至不自旋,总之,比较智能。

  • 自旋会占用CPU时间,单核CPU自旋就是浪费,多核CPU自旋才能发挥优势。
  • Java7之后不能控制是否开启自旋功能。

4、偏向锁

轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行CAS操作。Java6中引入了偏向锁来做进一步优化:只有第一次使用CAS将线程ID设置到对象的Mark Word头,之后发现这个线程ID是自己的就表示没有竞争,不用重新CAS。

  • 撤销偏向需要将持锁线程升级为轻量级锁,这个过程中所有线程需要暂停(STW)
  • 访问对象的hashcode也会撤销偏向锁
  • 如果对象虽然被多个线程访问,但没有竞争,这时偏向了线程T1的对象仍有机会偏向T2,重偏向会重置对象的ThreadID
  • 撤销偏向和重偏向都是批量进行的,以类为单位
  • 如果撤销偏向到达某个阈值,整个类的所有对象都会变为不可偏向的。
  • 可以主动使用 -XX:-UseBiasedLocking 禁用偏向锁

5、其他优化

  1. 减少上锁时间

    同步代码块中尽量短

  2. 减少锁的粒度

    将一个锁拆分为多个锁提高并发度,例如:

    • ConcurrentHashMap
    • LongAdder 分为base 和 cells 两部分。没有并发争用的时候或者是cells数组正在初始化的时候,会使用CAS来累加值到base,有并发争用,会初始化cells数组,数组有多少个cell,就允许有多少线程并行修改,最后将数组中每个cell累加,再加上base就是最终的值。
    • LinkedBlockingQueue入队和出队使用不同的锁,相对于LinkedBlockingArray只有一个锁效率更高
  3. 锁粗化

    多次循环进入同步块不如同步块内多次循环

    另外JVM可能会做如下优化,把多次append的加锁操作粗化一次(因为都是对同一个对象加锁,没必要重入多次)

    new StringBuffer().append("a").append("b").append("c");
    
  4. 锁消除

    JVM会进行代码逃逸分析,例如某个加锁对象是方法内局部变量,不会被其他线程所访问到,这时候就会被即时编译器忽略掉所有同步操作。

  5. 读写分离

    CopyOnWriteArrayList

    ConvOnWriteSet

标签:synchronized,对象,CAS,线程,偏向,自旋,优化,轻量级
来源: https://www.cnblogs.com/isfjh/p/15955556.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有