Java synchronized 关键字用法

132 阅读2分钟

java 中的 synchronized 关键字是一种同步机制,用于保证多个线程在共享资源时的数据一致性和线程安全性。synchronized 可以修饰方法或者代码块,表示该方法或者代码块只能被一个线程执行,其他线程要等待当前线程释放锁后才能继续执行。

synchronized 修饰方法有两种形式:静态方法和非静态方法。静态方法的锁对象是类对象,即 Class 对象,非静态方法的锁对象是实例对象,即 this 对象。例如:

public class SynchronizedDemo {  
  
// 静态方法,锁对象是 SynchronizedDemo.class  
public static synchronized void staticMethod() {  
// do something  
}  
  
// 非静态方法,锁对象是 this  
public synchronized void instanceMethod() {  
// do something  
}  
}  

synchronized 修饰代码块时,需要指定一个锁对象,可以是任意类型的对象。例如:

public class SynchronizedDemo {  
  
private Object lock = new Object();  
  
public void syncBlock() {  
// 同步代码块,锁对象是 lock  
synchronized (lock) {  
// do something  
}  
}  
}  

synchronized 的作用是保证同一时刻只有一个线程能够访问共享资源,从而避免数据不一致或者线程安全问题。但是,synchronized 也有一些缺点,比如:

  • synchronized 是重量级锁,会消耗较多的系统资源和性能。
  • synchronized 会导致线程阻塞和等待,降低了并发性和吞吐量。
  • synchronized 可能会发生死锁,如果多个线程相互持有对方需要的锁,而不释放自己的锁。

因此,在使用 synchronized 时,需要注意以下几点:

  • 尽量减少同步范围,只同步必要的代码块。
  • 尽量使用私有的、不可变的、唯一的锁对象,避免被其他线程修改或者共享。
  • 尽量避免在同步代码块中调用其他可能造成阻塞的操作,比如 I/O 操作、数据库操作等。
  • 尽量避免嵌套使用 synchronized ,以免造成死锁。

以上就是 java synchronized 关键字用法详解的内容,希望对大家有所帮助。