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){…}
但是(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...
}