【发布时间】:2018-08-14 10:32:04
【问题描述】:
我正在尝试使用以下方法了解同步的确切差异:
synchronized(MyClass.class){...}synchronized(myClassInstance.getClass()){...}[编辑为MyClass.getClass()甚至无法编译]synchronized(this){...}
感谢其他帖子,我知道 (1) 用于确保块中只有一个线程,而 (3) 确保每个实例只有一个线程。
(见Java Synchronized Block for .class)
但是 (2) 做了什么?是否与(3)相同?
【问题讨论】:
-
(1) 在
Class上同步,(2) 不编译:您在静态上下文中使用实例方法,(3) 在实例上同步。 -
如果你写
myClassInstance,#2 会起作用,但在这种情况下,它与#1 相同;该类的引用方式不同(也就是说,如果myClassInstance不是派生类的实例而不是基类)。 -
#2 至少也可以用
MyClass.class.getClass()编译,不是吗? -
@Clijsters 不,那将是类实例的类,对于任何类可能都是相同的(当然是
class java.lang.Class)。好吧,它会起作用:它会以与我假设的 #1 相同的方式锁定,但不建议对非本地的东西设置锁定。 -
我刚做了它并编译了。当您编辑您的评论时:我只是说它会编译,这没有意义,也不推荐;)
标签: java multithreading synchronization thread-safety