synchronized(this)和synchronized(ClassName.class)有什么区别?

ef2*_*011 13 java synchronized

我读到了synchronized(this)应该避免的各种原因.然而,我遇到的一些可敬的代码在构造函数中使用以下代码:

public SomeClass(Context context) {
  if (double_checked_lock == null) {
    synchronized (SomeClass.class) {
      if (double_checked_lock == null) {
        // some code here
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

是否真的之间的差异synchronized(this)synchronized(SomeClass.class)

DNA*_*DNA 26

synchronized(this)在当前对象上同步,因此只有一个线程可以访问每个实例,但不同的线程可以访问不同的实例.例如,每个线程可以有一个实例.

这通常有助于防止多个线程同时更新对象,这可能会创建不一致的状态.

synchronized(SomeClass.class)在当前对象的(或者如果有人希望的另一个类)上同步,因此一次只有一个线程可以访问该类的任何实例.

这可能用于保护在类的所有实例(实例高速缓存或实例总数的计数器)之间共享的数据不会进入不一致状态.

  • +1。这使得类锁和对象锁之间更加清晰。我没有发现比这更好的东西了。*简短易懂* (2认同)

SLa*_*aks 6

this每个实例都有所不同.
ClassName.class不是.

因此,synchronized(this)将允许多个实例同时运行.