java1.8锁升级
时间: 2024-12-25 12:22:48 浏览: 4
### Java 1.8 中锁升级机制及实现原理
#### 锁的状态及其转换过程
在Java 1.8中,`synchronized`关键字所使用的锁机制经历了多个状态的变化,具体包括无锁、偏向锁、轻量级锁(自旋锁)、重量级锁。这种变化被称为锁升级,其目的在于提高程序性能的同时减少不必要的资源消耗。
当一个对象刚被创建并首次尝试获取该对象上的`synchronized`锁时,默认情况下会先处于无锁状态[^3]。此时的对象头中包含了一个指向持有者线程的指针以及一些额外的信息用于支持后续可能发生的锁操作。
一旦有单一线程访问某个特定实例的方法或代码块,则此实例会被标记为偏向模式下的锁定目标;即进入所谓的“偏向锁”。在此状态下,只要同一线程再次请求相同的锁就不会触发任何实际的竞争处理逻辑,从而极大地提高了吞吐率。值得注意的是,在JDK 1.8里,为了防止因早期活动而导致频繁地切换回全局共享锁而影响效率,引入了一定时间内的延迟开启策略来决定是否启用偏向特性。
然而,随着更多不同步调的其他线程也开始争夺同一个监视器所有权的时候,原先存在的偏好关系便不再适用——系统不得不取消当前设置好的偏移,并进一步提升至更高级别的控制形式:首先是转变为轻量级锁。在这个阶段内,虚拟机会利用CAS原子指令试图快速占有指定区域而不必立即陷入阻塞等待队列之中。倘若多次重试均未成功获得许可,则最终被迫降格成传统的重量级锁形态,这也就意味着所有后来者都得乖乖排队直至前序事务完成释放为止[^2]。
```java
public class LockUpgradeExample {
private final Object monitor = new Object();
public void performAction() {
synchronized (monitor) { // 可能经历从无锁到偏向锁再到轻量级/重量级的过程
System.out.println(Thread.currentThread().getName());
}
}
public static void main(String[] args) throws InterruptedException {
var example = new LockUpgradeExample();
Thread t1 = new Thread(example::performAction);
Thread t2 = new Thread(example::performAction);
t1.start(); t2.start();
t1.join(); t2.join();
}
}
```
阅读全文