基本使用
Java中的synchronized关键字用于在多线程环境下确保数据同步。它可以用来修饰方法和代码块
当一个线程访问一个对象的synchronized方法或代码块时,其他线程将无法访问该对象的其他synchronized方法或代码块。这样可以确保在同一时间只有一个线程能够执行该代码块或方法,避免了多线程环境下的数据不一致问题
例如:
public class SynchronizedExample {
private int count = 0;
public synchronized void increment() {
count++;
}
}
在上面的代码中,increment()方法是一个synchronized方法。当多个线程访问这个方法时,只有一个线程能够执行该方法的代码,其他线程将被阻塞
synchronized关键字也可以用来修饰代码块,如:
public void increment() {
synchronized(this) {
count++;
}
}
在上面的代码中,synchronized关键字修饰的是一个代码块,并且锁对象是当前对象(this)
注意:synchronized关键字会导致线程上下文切换和资源竞争,所以在使用时要注意性能问题
源码解析
底层实现是通过 Java 虚拟机(JVM)的对象头和监视器锁机制实现的
具体来说,当一个线程访问一个对象的 synchronized 方法或代码块时,它会试图获取该对象的监视器锁。如果该锁未被其他线程占用,该线程将获得该锁并执行代码;如果该锁被其他线程占用,该线程将进入阻塞状态,等待获取该锁
这里给出一份简化的 synchronized 关键字的源码:
public void synchronized method() {
// 加锁
Monitor.enter(this);