2

根据 JLS第 8.4.3.6 节

同步方法在执行之前获取监视器(第 17.1 节)。

对于类(静态)方法,使用与方法类的 Class 对象关联的监视器。

在这个同步方法中,移动类级别的锁被获取。那么究竟是使用哪个Class对象来获取这个锁。是 Interface.class还是ClassImplementingInterface.class?如果是后者,是否有任何场景可以使用接口监视器?或者更确切地说接口是否有监视器?

我已经阅读过每个对象都与一个监视器相关联,并且在静态锁的情况下,监视器是在相应的 Class 对象上获得的。正如我们可以做的那样,Interface.Class 意味着接口具有相应的 Class 对象,我们可以在不明确说明的情况下锁定该监视器synchronized(Interface.class)

4

1 回答 1

1

Aninterface是一种类型,因此可以获取它的Class<?>对象

public interface MyTest {}
...
Class<?> clazz = MyTest.class;

但是,对于 Java 7 及之前的版本,您的问题没有实际意义,因为接口不能具有静态方法并且静态方法不能被覆盖,因此它总是会获取Class被调用的类的对象。

public class StaticTest {
    public static synchronized void test() {
        // something
    }
}

调用StaticTest.test()将在StaticText.class对象上同步。

至于带有synchronized修饰符的实例方法,它将再次成为您将获取的调用对象的监视器(锁)。

在 Java 8 中,您可以static在接口中声明和定义方法,但不能使用synchronized关键字修改它们。

InterfaceMethodModifier:
    (one of)
    Annotation public
    abstract default static strictfp

这又不是问题。


回答

有没有我们可以拥有接口监视器的场景

不带synchronized修饰符。但是您始终可以在接口的Class对象上使用同步块。

synchronized (MyTest.class) {...}

但实际上,你为什么要这样做?我认为阅读您的代码的人会感到困惑。

于 2013-09-08T15:42:06.230 回答