同步(this)和synced(ClassName.class)有什么区别?

2022-09-02 23:14:37

我读到过一些出于各种原因应该避免的地方。然而,我遇到的一些值得尊敬的代码在构造函数中使用了以下内容:synchronized(this)

public SomeClass(Context context) {
  if (double_checked_lock == null) {
    synchronized (SomeClass.class) {
      if (double_checked_lock == null) {
        // some code here
      }
    }
  }
}

和 之间真的有区别吗?synchronized(this)synchronized(SomeClass.class)


答案 1

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

这通常可用于防止多个线程同时更新对象,这可能会产生不一致的状态。

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

这可用于保护在类的所有实例(实例缓存或实例总数的计数器)之间共享的数据,防止进入不一致的状态。


答案 2

this对于每个实例,都不同。
莫。ClassName.class

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


推荐