java synchronized原理 锁升级原理

本文详细解析了Java中`synchronized`关键字的锁机制,包括其基于对象头markword的工作原理,以及锁升级过程如何根据多线程竞争动态调整,以平衡线程安全和并发性能。

Java中的synchronized关键字是一种内置锁机制,用于控制对共享资源的并发访问。其原理、锁升级过程和原理可以如下解释:

synchronized 原理

synchronized的原理基于Java对象头中的mark word。每个Java对象都有一个mark word,它用于存储对象的哈希码、锁信息以及GC分代年龄等信息。当一个线程尝试获取一个对象的synchronized锁时,JVM会尝试在对象的mark word中存储锁的信息和持有锁的线程ID。

  • 无锁状态:对象的mark word中没有锁信息,此时任何线程都可以获取锁。
  • 偏向锁状态:如果同一个线程多次获取同一个对象的锁,那么锁会进入偏向锁状态。在这个状态下,mark word中会存储偏向线程的ID,这样当这个线程再次尝试获取锁时,不需要进行竞争,直接获取成功。
  • 轻量级锁状态:当多个线程尝试获取同一个对象的锁时,偏向锁会升级为轻量级锁。此时,mark word中会存储锁信息,但不会存储线程ID。线程在尝试获取锁时会进行自旋(忙等待),直到获取到锁或者确定无法获取锁(比如其他线程持有锁并正在执行)。
  • 重量级锁状态:如果自旋等待时间过长或者竞争过于激烈,轻量级锁会升级为重量级锁。此时,线程在尝试获取锁时会进入阻塞状态,并被放入锁对象的等待队列中。只有当持有锁的线程释放锁时,才会唤醒等待队列中的线程。

锁升级过程

锁升级过程是根据多线程访问共享资源的竞争情况动态调整的。

  1. 偏向锁升级:当一个线程首次访问synchronized代码块或方法时,会尝试获取偏向锁。如果成功,该线程会持有偏向锁,并且后续对该资源的访问不需要再次获取锁,直到有其他线程尝试访问该资源。如果其他线程尝试获取锁,偏向锁会升级为轻量级锁。
  2. 轻量级锁升级:当偏向锁出现竞争现象时,会升级为轻量级锁。在轻量级锁状态下,线程会尝试自旋等待(即循环检查锁是否可用),而不是立即进入阻塞状态。如果自旋等待时间过长或竞争过大,轻量级锁会升级为重量级锁。
  3. 重量级锁:当轻量级锁无法满足需求时(例如,自旋等待时间过长或竞争过大),锁会升级为重量级锁。在重量级锁状态下,如果线程尝试获取锁失败,它会被阻塞并放入等待队列中。只有持有锁的线程释放锁之后,才会唤醒这些线程。

锁升级原理

锁升级的原理是基于多线程竞争程度和系统开销的权衡。在低竞争程度下,使用偏向锁和轻量级锁可以提高并发性能,减少线程切换和上下文切换的开销。而在高竞争程度下,使用重量级锁可以确保线程安全,但会牺牲一定的性能。

JVM通过监测锁的竞争情况来动态调整锁级别。如果锁竞争激烈,JVM会将锁升级为更高级别的锁,以确保线程安全。相反,如果锁竞争较低,JVM会尽量使用低级别的锁,以提高并发性能。

总之,synchronized的锁升级过程是一种动态调整锁级别的机制,旨在根据多线程竞争程度和系统开销的权衡来提高并发性能。通过从低级别的锁逐步升级到高级别的锁,可以在保证线程安全的同时减少系统开销。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值