请问Java方法可以同时即是static又是synchronized的吗?
是的,Java方法可以同时声明为static和synchronized。以下是关键要点:
- 语法合法性
从语法层面看,Java允许static与synchronized同时修饰方法。此时方法的锁机制基于类的Class对象(称为类锁),而非实例对象锁。 - 锁粒度的差异
- 静态同步方法:锁作用于整个类,任何线程访问该方法时需获取该类的Class对象锁,所有类的实例共享同一锁。
- 非静态同步方法:锁作用于调用该方法的实例对象,不同实例间的锁相互独立。
- 并发行为
静态同步方法和非静态同步方法使用不同锁,因此同一线程可同时调用一个类的静态同步方法和非静态同步方法而不会发生互斥阻塞。
示例:
public class Example {
public static synchronized void staticMethod() { /* 类锁 */ }
public synchronized void instanceMethod() { /* 实例锁 */ }
}