【问题标题】:Synchronized block equivalent to static synchronized method?同步块相当于静态同步方法?
【发布时间】:2011-03-20 15:59:04
【问题描述】:

当你有如下方法时:

public synchronized void addOne() {
    a++;
}

相当于如下:(如果我错了,请纠正我)

public void addOne() {
    synchronized(this) {
        a++;
    }
}

但是和下面的方法等价的是什么?:

public static synchronized void addOne() {
    a++;
    // (in this case 'a' must be static)
}

什么是与静态同步方法相同的同步块?我知道静态同步方法是在类而不是实例上同步(因为没有实例),但是什么那是什么语法?

【问题讨论】:

标签: java


【解决方案1】:

相当于锁定类对象。您可以通过编写类名后跟.class 来获取对类对象的引用。所以,类似:

synchronized(YourClass.class) {
}

Java Language Specification, Section 8.4.3.6 synchronized Methods

同步方法获取锁 (§17.1) 在它执行之前。为一个 类(静态)方法,锁 与 Class 对象相关联 使用方法的类。为 实例方法,关联的锁 与此(对象为其 方法被调用)被使用。

【讨论】:

  • 是的,感谢您参考 JLS - 总是一本有趣的书!这是 Oracle 域上的更新链接:JLS §8.4.3.6。它还提供了一个简单的示例,说明“与 Class 对象关联的监视器”确实是类本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多