1.锁的对象不同
(1)普通方法
修饰的对象是调用该方法的实例对象(即this),这意味着每个实例对象都有自己的锁,因此,如果有多个实例对象调用同一个synchronized修饰的普通方法,它们之间不会相互阻塞(每个对象都持有自己的锁)。
(2)静态方法
当synchronized修饰静态方法时,锁的对象是当前类的Class对象。类的Class对象是唯一的,因此所有该类的实例对象在调用同一个synchronized静态方法时,会共享同一把锁,他们可能会相互阻塞,只有一个线程能够进入方法。
2.性能影响
静态方法的锁通常比普通方法的锁开销更小,因为它锁定的是类而不是实例对象,但这也可能导致更高的争用率,因为所有实例对象都共享同一个锁。
在选择使用synchronized关键字时,需要考虑到线程安全性、性能和应用场景等因素,如果方法操作的是实例对象的私有数据,并且这些私有数据不会被其他实例对象共享,那么使用synchronized修饰普通方法可能更合适,如果方法操作的是静态数据或需要确保整个类的线程安全,那么使用synchronized修饰静态方法可能更合适。
public class Example {
public synchronized void synchronizedMethod() {
// 普通方法的同步代码块
}
public static synchronized void synchronizedStaticMethod() {
// 静态方法的同步代码块
}
}