3

如果我有这样的方法

public synchronized static foo()
{

}

这编译得很好。

所以这让我想到了两个问题

  1. 什么是同步?类,还是别的什么?
  2. 您可以在一个类上同步吗,是否也会锁定该类的所有对象。

例如你能这样做吗

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

4 回答 4

3

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

synchronized(Foo.class) {
}

是正确的。

如果您想对类同步采取防御措施,则应在类外不可见的私有静态对象上进行同步。这可以防止恶意代码通过在其类对象上执行来阻止您的静态方法synchronized,从而阻止合法方法。

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

于 2012-04-16T01:33:49.713 回答
3

是的,它正在Class对象上同步。Class您可以在任何对象上进行同步。您可以使用它的字面量 ( ) Foo.class,也可以使用.getClass()Foo

有关同步的更多信息(该路径中的第二页包含有关使用哪些锁同步方法的信息):http ://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

于 2012-04-16T01:36:01.940 回答
2
  1. 它正在class对象上同步,例如MyClass.class
  2. 不,它不会锁定类的对象
于 2012-04-16T01:36:39.190 回答
0

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

Java 语言规范的相关部分是8.4.3.6, 'synchronized Methods'

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

于 2012-04-16T01:41:41.357 回答