synchronized用于静态方法与普通方法有区别吗?
时间: 2023-05-27 12:02:39 浏览: 73
在Java中,synchronized关键字用于控制多个线程对共享资源的并发访问。synchronized既可用于实例方法,也可用于静态方法。但是,对于静态方法和实例方法,synchronized在效果上是有区别的。
实例方法:
当一个线程调用对象的实例方法时,它会获得该实例的锁,这意味着其他线程无法在同时调用该实例的同一个同步方法。但是,不同实例的同步方法可以同时运行,因为它们拥有不同的锁。这是因为每个实例都有一个隐式的锁对象,线程必须持有该锁对象才能进入同步代码块。例如:
```
public synchronized void method() {
//code
}
```
修饰实例方法时,在多线程并发时相当于对类实例加了一个锁,只要线程获得了该实例的锁,就可以执行synchronized方法体中的代码了。
静态方法:
静态方法使用synchronized修饰时,该方法相当于只有一个实例(类实例)并被该实例所锁定。多线程并发时,只要线程获得了类对象(class)的锁,就可以执行synchronized方法体中的代码了。例如:
```
public static synchronized void method() {
//code
}
```
修饰静态方法时,在多线程并发时相当于对类实例加了一个锁,只有一个线程能执行类中的同步方法(synchronized修饰的方法),而无法执行其他线程的同步方法。
综上所述,synchronized用于静态方法与普通方法是有区别的。在多线程并发时,synchronized修饰的实例方法是以对象为锁,而synchronized修饰的静态方法是以类为锁。