.class的Java同步块

97 java multithreading synchronization locking synchronized

这个java代码是什么意思?它会锁定所有物体MyClass吗?

synchronized(MyClass.class) {
   //is all objects of MyClass are thread-safe now ??
}
Run Code Online (Sandbox Code Playgroud)

以上代码与此不同:

synchronized(this) {
   //is all objects of MyClass are thread-safe now ??
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*ung 138

该代码段synchronized(X.class)使用类实例作为监视器.由于只有一个类实例(在运行时表示类元数据的对象),因此一个线程可以在此块中.

随着synchronized(this)块由实例把守.对于每个实例,只有一个线程可以进入该块.

synchronized(X.class)用于确保块中只有一个Thread.synchronized(this)确保每个实例只有一个线程.如果这使得块中线程安全的实际代码取决于实现.如果mutate只有实例的状态synchronized(this)就足够了.

  • "因为有多个线程可以进入块,因为有实例"意味着第二个形式充当信号量,这是不正确的.您应该说:"synchronized(this)确保只有一个线程可以进入该类的给定实例的块". (6认同)
  • 什么是类实例与实例? (2认同)

Jor*_*orn 79

要添加到其他答案:

static void myMethod() {
  synchronized(MyClass.class) {
    //code
  }
}
Run Code Online (Sandbox Code Playgroud)

相当于

static synchronized void myMethod() {
  //code
}
Run Code Online (Sandbox Code Playgroud)

void myMethod() {
  synchronized(this) {
    //code
  }
}
Run Code Online (Sandbox Code Playgroud)

相当于

synchronized void myMethod() {
  //code
}
Run Code Online (Sandbox Code Playgroud)

  • 我花了二读才发现前两个例子的关键字是"静态".只是指出那些可能已经看到并错过它的人.如果没有static关键字,前两个示例将不相同. (10认同)
  • 这些例子是不等价的!当线程尝试调用方法时,同步方法被“同步”为一个漏洞。另一方面,块可以在其上方和下方具有代码,可以从多个线程执行。它们只在块内同步!那不一样! (2认同)
  • 关键是在“ synchronized”块之外没有代码。这使它们等效。如果您更改一个示例,则它们确实不再相同。 (2认同)

Dav*_*d M 21

不,第一个会锁定类的定义MyClass,而不是它的所有实例.但是,如果在实例中使用,这将有效地阻止所有其他实例,因为它们共享单个类定义.

第二个只会锁定当前实例.

至于这是否使您的对象线程安全,这是一个更复杂的问题 - 我们需要看到您的代码!