Java静态同步

ran*_*don 2 java multithreading

可能重复:
同步静态方法如何在Java中工作?

有人能让我理解以下两个功能之间的根本区别:

public static void synchronized f() {… } 
Run Code Online (Sandbox Code Playgroud)

public void synchronized f() {… }
Run Code Online (Sandbox Code Playgroud)

Rob*_*rop 12

如果是

public void synchronized f(){...}
Run Code Online (Sandbox Code Playgroud)

同步是封闭类的每个实例.这意味着多个线程可以调用f不同的类的实例.

对于

public static void synchronized f(){...}
Run Code Online (Sandbox Code Playgroud)

无论封闭类的实例数是多少,一次只能有一个线程调用该方法.

从技术上讲,synchronized第一个示例中的监视器是对象实例的监视器,第二个示例中的监视器是对象的监视器Class.

请注意,如果您有不同的同名类ClassLoaders,则不要共享同一个监视器,但这是您不太可能遇到的细节.