synchronized关键字可以修饰方法、代码块或静态方法,用于确保同一时间只有一个线程可以访问被synchronized修饰的代码片段。
- 修饰实例方法: 当synchronized修饰实例方法时,锁住的是当前实例对象(this)。这意味着在同一时刻,只能有一个线程访问此方法,其他线程需要等待当前线程执行完毕才能执行该方法。修饰实例方法的方式可以确保对实例变量的访问是线程安全的。
public synchronized void methodName() {
// synchronized 代码块
}
- 修饰静态方法: 当synchronized修饰静态方法时,锁住的是类的Class对象。因此,无论多少个该类的实例存在,同一时刻也只有一个线程能够访问此静态同步方法。这种方式可以确保对静态变量的访问是线程安全的。
public static synchronized void staticMethodName() {
// synchronized 代码块
}
- 修饰代码块: 使用 synchronized 关键字修饰一个代码块,将需要同步的代码包裹在 synchronized 关键字所修饰的代码块中。通过指定对象作为锁,可以更精确地控制同步范围,只有持有该对象锁的线程才能执行被synchronized修饰的代码块。
synchronized (obj) {
// 需要同步的代码块
}
synchronized关键字确保了对共享资源的访问是线程安全的。但过多地使用synchronized可能会导致性能问题,因此在设计并发程序时需要权衡考虑。