区别:此与Myclass.class与MyClass.getClass()同步

时间:2018-08-14 10:32:05

标签: java multithreading synchronization thread-safety

我正在尝试使用以下方法了解同步的确切差异:

  1. synchronized(MyClass.class){...}

  2. synchronized(myClassInstance.getClass()){...} [编辑为MyClass.getClass()甚至没有编译]

  3. synchronized(this){...}

感谢其他帖子,我得到了(1)用于确保块中仅存在一个线程,而(3)确保每个实例中仅存在一个线程。 / p>

(请参阅Java Synchronized Block for .class

但是(2)做什么?与(3)相同吗?

2 个答案:

答案 0 :(得分:0)

第1点将锁定类对象,并且JVM中只能存在一个对象(如果同一类未由不同的类加载器加载)。这可以与静态以及中午静态方法一起使用

第二个选项将无法编译。

第三选项将锁定当前对象。第三个选项可以与实例方法一起使用,因为在静态方法的情况下可以使用。

答案 1 :(得分:0)

您提到您已经了解选项#1和#3,因此我将重点介绍选项#2。

正如我在问题注释中指出的那样,选项#2的编写方式不正确。但是,我相信您的意图是以实例方式而不是静态方式(MyClass.class)获取类。

public class MyClass {

    public void foo() {
        synchronized (MyClass.class) {
        }
    }

    public void bar() {
        synchronized (getClass()) {
        }
    }

}

在上面的代码中,MyClass.classgetClass()都返回 same 对象,这意味着它们是“等效的”。但是,您在这里必须小心。

public class MySubClass extends MyClass {
    // inherits methods...
}

现在,这两种方法(foobar等效。方法foo仍使用Class的{​​{1}}进行同步,但是MyClass现在使用bar的{​​{1}}(即它们不再同步)在同一个对象上。