“引用”或实例上的同步

时间:2009-12-14 11:31:44

标签: java synchronization

请考虑以下代码:

public class Foo {
  private static final Object LOCK = new Object();
  private Object _lockRef1 = LOCK;
  private Object _lockRef2 = LOCK;
  private int _indx = 0;

  public void dec() {
    synchronized(_lockRef1) {
      _indx--;
    }
  }

  public void inc() {
    synchronized(_lockRef2) {
      _indx++;
    }
  }
}

调用方法dec()inc()线程安全吗?一方面,这些方法在两个不同的实例_ lockRef1和_ lockRef2上同步。另一方面,这些实例“指向”同一个对象LOCK ...

1 个答案:

答案 0 :(得分:18)

它们不是“在两个不同的实例上同步” - 仅仅因为您使用两个不同的变量并不意味着有两个不同的实例。你有几个变量,每个变量具有相同的值 - 对java.lang.Object的单个实例的引用。

所以是的,这是线程安全的。当然,你不应该在可读性方面编写这样的代码,但假设你只是想了解发生了什么,那就没关系了。