Synchronized
关键字在 Java 中用于实现线程同步,确保在多线程环境下对共享资源的访问是安全的。当应用于方法时,它可以用于静态方法和普通方法,但二者之间确实存在一些区别。
-
锁的对象不同:
- 对于普通方法,锁的对象是调用该方法的实例对象(即
this
)。 - 对于静态方法,锁的对象是当前类的 Class 对象。
- 对于普通方法,锁的对象是调用该方法的实例对象(即
-
影响范围不同:
- 对于普通方法,锁的范围是实例对象级别的,即每个实例对象有自己的锁。
- 对于静态方法,锁的范围是类级别的,即所有该类的实例对象共享同一个锁。
-
性能影响:
- 静态方法的锁通常比普通方法的锁开销更小,因为它锁定的是类而不是实例对象。
考虑以下示例:
public class Example {public synchronized void synchronizedMethod() {// 普通方法的同步代码块}public static synchronized void synchronizedStaticMethod() {// 静态方法的同步代码块}
}
对于 synchronizedMethod()
,每个实例对象都有自己的锁,因此如果有多个实例对象同时调用该方法,它们之间不会相互阻塞。
对于 synchronizedStaticMethod()
,所有实例对象共享同一个锁,因此如果有多个实例对象同时调用该方法,它们会相互阻塞,只有一个线程能够进入该方法执行。
在选择使用 synchronized
关键字时,需要考虑到线程安全性、性能和应用场景等因素。