Java 同步静态方法



如果我有这样的方法

public synchronized static foo()
{
}

这编译得很好。

因此,这让我想到了两个问题

  1. 什么是同步? 班级,还是别的什么?
  2. 你能在一个类
  3. 上同步吗,这是否也锁定了该类的所有对象。

例如,你能这样做吗

synchronized(Foo) // where Foo is a class
{
}

MyClass 中的同步静态方法本质上与synchronized(MyClass.class)块相同。你的第二个例子应该重写为

synchronized(Foo.class) {
}

是正确的。

如果你想对类同步

进行防御,你应该在类外部不可见的私有静态对象上进行同步。这可以防止恶意代码通过对其类对象执行synchronized来阻止静态方法,从而阻止合法方法。

就"锁定所有对象"而言,标记为synchronized的非静态方法不会通过执行静态synchronized方法来锁定,因为常规synchronized方法锁定对象的实例,而不是其类。

是的,它正在Class对象上同步。您可以在任何Class对象上进行同步。您可以使用其文字 ( Foo.class ),也可以使用 Foo 实例的 getClass() 方法。

有关

已同步的详细信息(该跟踪中的第二页包含有关使用哪种锁同步方法的信息):http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

  1. 它在class对象上同步,例如MyClass.class
  2. 否,它不会锁定类的对象

静态方法使用类作为锁定的对象。

Java 语言规范的相关部分是 8.4.3.6,"同步方法":

同步方法在执行监视器 (§17.1) 之前获取监视器。对于类(静态)方法,使用与该方法的类的 Class 对象关联的监视器。对于实例方法,使用与此关联的监视器(为其调用该方法的对象)。

最新更新