synchronized关键字的原理
时间: 2023-11-21 21:45:38 浏览: 104
synchronized关键字用于解决多个线程之间对共享资源的同步访问问题。它可以保证同一时间只有一个线程执行被它修饰的方法或者代码块。synchronized关键字的原理是通过加锁和释放锁的机制来实现的。当一个线程获得了对象的锁后,其他线程就无法访问该对象的加锁方法或者代码块,只能等待获得锁的线程执行完成并释放锁后才能继续执行。这样就保证了同一时间只有一个线程能够访问被synchronized修饰的方法或者代码块,从而保证了对共享资源的安全访问。
相关问题
synchronized关键字底层原理
### Java 中 `synchronized` 关键字的底层实现原理
#### 同步代码块的结构
当定义一个同步方法或同步代码块时,实际上是在告诉 JVM 需要对该段代码进行锁定处理。对于给定的例子:
```java
private int i = 0;
public void fun(){
synchronized(this){
i++;
}
}
```
这段代码表示只有获得当前实例 (`this`) 的锁之后才能进入并执行 `{}` 大括号内的语句[^1]。
#### 底层编译后的指令变化
在 JVM 层面,每当遇到 `synchronized` 修饰的方法调用或是显式的 `synchronized` 块时,会转换成特定的操作码来控制锁的行为。具体来说就是通过 `monitorenter` 和 `monitorexit` 操作符来进行加锁和解锁操作。每次进入由 `synchronized` 定义的临界区之前都会先执行一次 `monitorenter` 来尝试获取对象上的监视器(即锁),而一旦退出该区域则自动触发相应的 `monitorexit` 以释放持有的锁资源[^3]。
#### 锁的状态变迁与优化策略
JVM 对于锁有着多种不同的状态管理方式,包括但不限于无锁、偏向锁、轻量级锁以及重量级锁等形式。这些状态之间的转变取决于实际运行环境中的竞争程度等因素。例如,在没有任何其他线程试图访问相同对象的情况下,默认采用的是偏向锁模式;而在多线程并发争抢同一把锁的情形下,则可能升级至更重级别的锁形式如膨胀为重量级锁[^5]。
- **无锁**:最初始状态下,对象头中仅保存一些基本信息而不涉及任何锁机制。
- **偏向锁**:允许单一线程长时间持有某个对象的独占使用权,减少不必要的上下文切换开销。
- **轻量级锁**:适用于短时间内的低冲突场景,利用原子性的 CAS (Compare And Swap) 操作快速完成上锁过程。
- **重量级锁**:当上述几种简化版无法满足需求时才会启用的传统 Monitor 实现方案,通常伴随着较高的性能损耗。
综上所述,`synchronized` 是一种基于 JVM 内部监控器机制构建而成的关键字,它能够有效地保障共享数据的一致性和可见性,尽管相比某些高级别的并发工具类而言可能会带来一定的性能损失,但在大多数情况下仍然是简单易用的选择之一。
synchronized关键字的实现原理
synchronized关键字是Java中用于实现线程同步的关键字。它可以应用于方法或代码块,确保在同一时间只有一个线程能够访问被synchronized修饰的代码块或方法。
实现原理主要包括以下几个方面:
1. 监视器锁(Monitor Lock):每个Java对象都有一个监视器锁,可以抽象地理解为对象内部的一种标记。当一个线程访问synchronized代码块或方法时,它会尝试获取对象的监视器锁,如果获取成功,则进入临界区执行代码;如果获取失败,则线程进入阻塞状态,直到获得锁为止。
2. 内存屏障(Memory Barrier):synchronized关键字不仅保证了互斥性(即同一时间只有一个线程能够执行synchronized代码块或方法),还保证了可见性和有序性。在释放锁之前,会将对共享变量的修改刷新到主内存中;在获取锁之前,会从主内存中重新读取共享变量的值,确保每个线程看到的共享变量值一致。
3. 重入性(Reentrancy):synchronized关键字是可重入的,即同一个线程可以多次获取同一个对象的监视器锁而不会发生死锁。每次获取锁时,锁的计数器会递增,释放锁时计数器递减,只有当计数器为0时才真正释放锁。
4. 互斥性(Mutual Exclusion):synchronized关键字保证了临界区的互斥性,同一时间只有一个线程能够执行被synchronized修饰的代码块或方法。其他线程需要等待当前占用锁的线程释放锁后才能继续执行。
需要注意的是,synchronized关键字只能用于同一个进程或线程内部的同步,不能用于不同进程或线程之间的通信和同步。在Java 5及之后,还引入了更灵活的Lock和Condition接口来替代synchronized关键字,提供了更多高级的线程同步操作和更细粒度的控制。
阅读全文
相关推荐














