Answers:
片段synchronized(X.class)
使用类实例作为监视器。由于只有一个类实例(在运行时表示类元数据的对象),因此该块中可以有一个线程。
用synchronized(this)
该块由实例保护。对于每个实例,只有一个线程可以进入该块。
synchronized(X.class)
用于确保该块中恰好有一个线程。synchronized(this)
确保每个实例只有一个线程。如果这样会使块中的实际代码具有线程安全性,则取决于实现。如果mutate,则仅实例的状态synchronized(this)
就足够了。
要添加其他答案:
static void myMethod() {
synchronized(MyClass.class) {
//code
}
}
相当于
static synchronized void myMethod() {
//code
}
和
void myMethod() {
synchronized(this) {
//code
}
}
相当于
synchronized void myMethod() {
//code
}
synchronized
块。这使它们等效。如果您更改一个示例,则它们确实不再相同。
不,第一个将锁定的类定义MyClass
,而不是它的所有实例。但是,如果在实例中使用,这将有效地阻止所有其他实例,因为它们共享一个类定义。
第二个将仅锁定当前实例。
关于这是否使您的对象线程安全,这是一个更为复杂的问题-我们需要查看您的代码!