用于.class的Java同步块
这个java代码是什么意思? 它会locking“MyClass”的所有对象吗?
synchronized(MyClass.class) { //is all objects of MyClass are thread-safe now ?? }
以上代码与这个代码有什么不同:
synchronized(this) { //is all objects of MyClass are thread-safe now ?? }
synchronized(X.class)
代码片段synchronized(X.class)
使用类实例作为监视器。 由于只有一个类实例(在运行时表示类元数据的对象),因此一个线程可以位于该块中。
与synchronized(this)
该块是由实例守护。 对于每个实例,只有一个线程可以进入该块。
synchronized(X.class)
用于确保块中只有一个线程。 synchronized(this)
确保每个实例只有一个线程。 如果这使得块中的实际代码是线程安全的,则取决于实现。 如果只改变synchronized(this)
实例的状态synchronized(this)
就够了。
要添加到其他答案:
static void myMethod() { synchronized(MyClass.class) { //code } }
相当于
static synchronized void myMethod() { //code }
和
void myMethod() { synchronized(this) { //code } }
相当于
synchronized void myMethod() { //code }
不,第一个会lockingMyClass
的类定义,而不是所有的实例。 但是,如果在一个实例中使用,这将有效地阻止所有其他实例,因为它们共享一个类定义。
第二个将仅在当前实例上获得locking。
至于这是否使你的对象线程安全,这是一个更复杂的问题 – 我们需要看你的代码!