Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 区别:这与Myclass.class和Myclass.getClass()同步_Java_Multithreading_Synchronization_Thread Safety - Fatal编程技术网

Java 区别:这与Myclass.class和Myclass.getClass()同步

Java 区别:这与Myclass.class和Myclass.getClass()同步,java,multithreading,synchronization,thread-safety,Java,Multithreading,Synchronization,Thread Safety,我试图通过以下方式了解同步的确切区别: synchronized(MyClass.class){…} synchronized(myClassInstance.getClass()){…}[编辑为MyClass.getClass()甚至不编译] synchronized(this){…} 多亏了其他文章,我得到了(1)用于确保块中只有一个线程,(3)确保每个实例只有一个线程 (见附件) 但是(2)做什么呢?它是否与(3)相同?第1点将锁定类对象,并且JVM中只能存在一个对象(如果同一个类没有由不

我试图通过以下方式了解同步的确切区别:

  • synchronized(MyClass.class){…}

  • synchronized(myClassInstance.getClass()){…}
    [编辑为
    MyClass.getClass()
    甚至不编译]

  • synchronized(this){…}

  • 多亏了其他文章,我得到了(1)用于确保块中只有一个线程,(3)确保每个实例只有一个线程

    (见附件)


    但是(2)做什么呢?它是否与(3)相同?

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

    第二个选项将不会编译


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

    您提到您已经了解选项1和3,所以我将重点介绍选项2

    正如我在问题注释中所述,选项2并没有按照书面形式编译。但是,我相信您的目的是以实例方式而不是静态方式获取类(
    MyClass.class

    在上面的代码中,
    MyClass.class
    getClass()
    都返回相同的对象,这意味着它们是“等价的”。然而,在这里你必须小心

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

    现在这两种方法(
    foo
    bar
    )并不等价。方法
    foo
    仍然使用
    MyClass
    Class
    进行同步,但是
    bar
    现在使用
    MySubClass
    Class
    (即,它们不再在同一对象上同步)。

    (1)在
    类上进行同步,2)不编译:您正在静态上下文中使用实例方法,(3)在实例上进行同步。如果您编写
    myClassInstance
    ,则第2个方法可以工作,但在这种情况下,它与第1个方法相同;该类只是以不同的方式引用(即,如果
    myClassInstance
    不是派生类的实例,而不是基类)。#2还可以至少使用
    MyClass.class.getClass()
    进行编译,不是吗?@Clijsters不,这将是类实例的类,对于任何类来说可能都是相同的(
    class java.lang.class
    当然)。好吧,它会起作用:我想它会以与#1相同的方式锁定,但不建议对非本地的东西设置锁定。我只是这样做并编译了它。当你编辑你的评论时:我只是说它会编译,没有意义,也不建议这样做;)
    public class MySubClass extends MyClass {
        // inherits methods...
    }