开发者社区 问答 正文

Java种关键字synchronized锁,优化包含些什么?

在Java8中,官方称对synchronized进行了各种的优化,那优化的方面有哪些,在那些方面体现出来??

展开
收起
magicalman 2021-10-19 18:39:48 535 分享 版权
阿里云 AI 助理回答

关于Java 8中对synchronized关键字的优化,实际上这些优化措施并不是Java 8特有的,而是从JDK早期版本就开始并持续进行的。不过,确实是在Java的发展过程中,包括Java 8时期,对于锁的机制和性能有了显著的提升。以下是一些主要的优化方面:

  1. 偏向锁(Biased Locking):这是从Java 6引入的一种优化手段,它假定大多数情况下锁只会被同一个线程访问,因此避免了不必要的锁争用开销。当一个线程访问同步块时,如果该锁之前没有被其他线程持有过,那么这个锁就会进入偏向模式,标记为“偏向”当前线程。下次该线程再访问时,无需执行传统的重量级锁获取操作,直接通过一个比较简单的检查就能继续执行。

  2. 轻量级锁(Lightweight Locking):当有第二个线程尝试获取已经被偏向的锁时,偏向锁会升级为轻量级锁。轻量级锁避免了操作系统级别的互斥量(mutex),而是在用户态下通过CAS(Compare and Swap)操作来试图获取锁,减少了系统调用的开销。

  3. 自旋锁(Spin Locking):在轻量级锁中,如果线程无法立即获得锁,它可能会选择自旋等待,即不断地循环检查锁的状态,而不是立即挂起线程。自旋的时间阈值是可调整的,以平衡CPU消耗与响应速度。这种策略在预期锁会被很快释放的情况下特别有效。

  4. 适应性自旋(Adaptive Spinning):这是对自旋锁的一个改进,JVM会根据前一次自旋是否成功、CPU的核心数量以及当前线程的等待状态等因素动态调整自旋的次数,以达到更好的性能效果。

  5. 锁消除(Lock Elimination):编译器在运行时分析代码,如果发现某些锁对象不可能被多个线程访问,那么这些锁会被消除,从而减少不必要的同步开销。

  6. 锁粗化(Lock Coarsening):如果一系列连续的操作都对同一个对象加锁和解锁,编译器或JVM可能会将这些锁合并成一个范围更大的锁,以减少加锁解锁的频率,提高效率。

  7. 重入优化(Reentrant Optimization):允许同一个线程多次获取同一把锁而不发生死锁,这在Java的synchronized机制中是默认支持的。

这些优化大多在Java 6及之后的版本中逐步引入和完善,并非Java 8独有,但它们确实在Java 8及其后续版本中得到了广泛应用和进一步的优化。这些技术共同作用,使得synchronized的性能大大提升,更加适用于高并发场景。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答