首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >synchronized(this)和synchronized(ClassName.class)有什么区别?

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

Stack Overflow用户
提问于 2012-01-30 03:47:38
回答 6查看 5.1K关注 0票数 17

我在某处读到various reasons应该避免使用synchronized(this)。然而,我遇到的一些值得尊敬的代码在构造函数中使用了以下内容:

代码语言:javascript
复制
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)之间真的有区别吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-01-30 03:52:27

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

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

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

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

票数 32
EN

Stack Overflow用户

发布于 2012-01-30 03:49:51

每个实例的this都不同。

ClassName.class并非如此。

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

票数 7
EN

Stack Overflow用户

发布于 2012-01-30 03:53:21

synchronized关键字,当应用于类上的class锁时,以及应用于当前对象实例上的this锁时。从Java Language Specification中的8.4.3.6, 'synchronized Methods'一节

同步方法在执行之前获取一个监视器(§17.1)。对于类(静态)方法,使用与该方法的类的class对象相关联的监视器。对于实例方法,将使用与此关联的监视器(调用该方法的对象)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9056190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档