synchronized锁的理解
时间: 2023-06-05 18:07:01 浏览: 69
Synchronized是Java中的一个关键字,它可以使用在方法或者代码块上,实现线程间的同步。当一个线程获得了一个对象的锁,那么其他需要该对象的锁的线程将被阻塞,直到获得该对象的锁的线程释放锁。通过synchronized保证了线程之间的顺序性和互斥性,避免了多个线程同时修改一个共享变量的问题。
相关问题
synchronized 锁升级
synchronized锁升级的过程可以总结为偏向锁 - 轻量级锁 - 重量级锁。具体的流程如下:
1. 偏向锁(Bias Locking):在没有竞争的情况下,synchronized会使用偏向锁来提高性能。偏向锁会将锁对象的标记字段设为线程ID,表示该线程获得了锁,其他线程不需要竞争锁资源。当其他线程尝试获取锁时,会检查锁对象的标记字段,如果与当前线程ID一致,说明可以直接获得锁,否则会进入轻量级锁的升级过程。
2. 轻量级锁(Lightweight Locking):当有其他线程竞争同一个锁对象时,偏向锁会升级为轻量级锁。轻量级锁通过CAS操作(比较并交换)来实现锁的获取和释放。当线程获取锁时,会将对象头中的锁记录指针指向线程的栈帧,表示线程获得了锁。当其他线程尝试获取锁时,会自旋一段时间,等待锁的释放。如果自旋超过一定次数,或者其他线程成功获取了锁,就会升级为重量级锁。
3. 重量级锁(Heavyweight Locking):如果轻量级锁的升级过程中仍然无法获取到锁,就会进一步升级为重量级锁。重量级锁会将等待获取锁的线程阻塞,使其进入等待状态,直到锁被释放。
这个锁升级的过程可以通过图1和图2来进行更直观的理解和展示。
synchronized理解
Synchronized 是 Java 中的关键字,用于实现线程间的同步。当多个线程访问共享资源时,使用 synchronized 可以确保在同一时刻只有一个线程能够执行特定的代码块或方法,从而避免多线程之间的竞态条件和数据不一致问题。
具体地,synchronized 可以用于以下两个场景:
1. 同步代码块:使用 synchronized 关键字修饰一段代码块,这个代码块称为同步块。同步块可以指定一个对象作为锁,也可以使用 this 关键字表示当前对象作为锁。当某个线程进入同步块时,它会尝试获取锁,如果锁已被其他线程占用,则该线程会被阻塞,直到获取到锁才能继续执行。
示例代码:
```java
synchronized (lockObject) {
// 同步块的代码
}
```
2. 同步方法:使用 synchronized 关键字修饰方法,这个方法称为同步方法。当某个线程调用同步方法时,它会自动获取该方法所属对象的锁,并在方法执行期间持有该锁。其他线程在此期间无法调用该对象的其他同步方法,直到该线程释放锁。
示例代码:
```java
public synchronized void synchronizedMethod() {
// 同步方法的代码
}
```
使用 synchronized 可以有效避免多线程并发访问共享资源时的数据不一致问题,但也可能引发死锁和性能问题,因此在使用时需要谨慎考虑。