我正在尝试使用以下方法了解同步的确切差异:
synchronized(MyClass.class){...}
synchronized(myClassInstance.getClass()){...}
[编辑为MyClass.getClass()
甚至没有编译]
synchronized(this){...}
感谢其他帖子,我得到了(1)用于确保块中仅存在一个线程,而(3)确保每个实例中仅存在一个线程。 / p>
(请参阅Java Synchronized Block for .class)
但是(2)做什么?与(3)相同吗?
答案 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.class
和getClass()
都返回 same 对象,这意味着它们是“等效的”。但是,您在这里必须小心。
public class MySubClass extends MyClass {
// inherits methods...
}
现在,这两种方法(foo
和bar
)不等效。方法foo
仍使用Class
的{{1}}进行同步,但是MyClass
现在使用bar
的{{1}}(即它们不再同步)在同一个对象上。