synchronize锁jdk1.6的升级

synchronize锁机制
  1. jdk1.6做了哪些升级和优化?
    • 适应自旋锁:为了减少线程状态改变带来的消耗 不停地执行当前线程
    • 锁消除:不可能存在共享数据竞争的锁进行消除
    • 锁粗化:将连续的加锁 精简到只加一次锁
    • 轻量级锁:无竞争条件下 通过CAS消除同步互斥
    • 偏向锁:无竞争条件下 消除整个同步互斥,连CAS都不操作
  2. 锁的使用机制
    • 加入有这样一个同步代码块,存在 Thread#1、Thread#2 等 多个线程

      情况一:只有 Thread#1 会进入临界区;

      情况二:Thread#1 和 Thread#2 交替进入临界区,竞争不激 烈;

      情况三:Thread#1/Thread#2/Thread3… 同时进入临界区, 竞争激烈

      • 偏向锁:
        • 此时当 Thread#1 进入临界区时,JVM 会将 lockObject 的 对象头 Mark Word 的锁标志位设为“01”,同时会用 CAS 操作把 Thread#1 的线程 ID 记录到 Mark Word 中,此时进 入偏向模式。所谓“偏向”,指的是这个锁会偏向于 Thread#1, 若接下来没有其他线程进入临界区,则 Thread#1 再出入 临界区无需再执行任何同步操作。也就是说,若只有 Thread#1 会进入临界区,实际上只有 Thread#1 初次进入 临界区时需要执行 CAS 操作,以后再出入临界区都不会有 同步操作带来的开销
      • 轻量级锁:
        • 偏向锁的场景太过于理想化,更多的时候是 Thread#2 也 会尝试进入临界区, 如果 Thread#2 也进入临界区但是 Thread#1 还没有执行完同步代码块时,会暂停 Thread#1 并且升级到轻量级锁。Thread#2 通过自旋再次尝试以轻量 级锁的方式来获取锁
      • 重量级锁:
        • 如果 Thread#1 和 Thread#2 正常交替执行,那么轻量级锁 基本能够满足锁的需求。但是如果 Thread#1 和 Thread#2 同时进入临界区,那么轻量级锁就会膨胀为重量级锁,意 味着 Thread#1 线程获得了重量级锁的情况下,Thread#2 就会被阻塞
  3. 锁的四种状态:随着竞争的激烈而逐渐升级,可以升级不可降级策略

    • 无锁状态:此时进入临界区无竞争
    • 偏向锁:只有一个线程进入临界区
    • 轻量级锁:多个线程交替进入临界区,竞争不激 烈
    • 重量级锁:多个线程同时进入临界区,竞争激烈
JDK 1.8中,ConcurrentHashMap的实现进行了完全重构。相对于JDK 1.7的版本,JDK 1.8的ConcurrentHashMap的数据结构更接近HashMap。它使用了synchronized和CAS(Compare and Swap)来进行同步操作,而不再使用分段的概念。的粒度也降低了,不再是基于Segment的,而是对每个桶(数组中的头节点)加。这样的改变使得操作更加清晰流畅。此外,JDK 1.8还使用红黑树来优化链表,当链表长度超过一定阈值时,会将链表转换为红黑树,提高遍历效率。总的来说,JDK 1.8的ConcurrentHashMap的实现更简单,操作更清晰流畅,同时也提高了性能。\[1\]\[2\] 另外,关于synchronized的变化,JDK 1.8之前的版本中,synchronized是通过底层的操作系统Mutex Lock来实现的,这种被称为"重量级"。由于的获取和释放需要从用户态转换到核心态,导致性能较低。但是在JDK 1.6之后,为了提高性能,引入了"轻量级"和"偏向"的概念,使得synchronized的效率与ReentrantLock相差无几,甚至在某些场景下更优于ReentrantLock。因此,在JDK 1.8中,synchronized的性能得到了提升。\[3\] #### 引用[.reference_title] - *1* [JDK1.8的ConcurrentHashMap底层实现解析](https://blog.csdn.net/qq_51901495/article/details/126320698)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Java集合源码剖析——基于JDK1.8中ConcurrentHashMap的实现原理](https://blog.csdn.net/weixin_43823808/article/details/126732474)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Synchronized原理和jdk1.8后的优化](https://blog.csdn.net/qq_35152037/article/details/105463688)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值