Java “上的同步”;参考资料;或者随便

Java “上的同步”;参考资料;或者随便,java,synchronization,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 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
..

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


是的,这是线程安全的。当然,就可读性而言,您不应该编写这样的代码,但假设您只是试图理解发生了什么,这没关系。

问题被标记为“Java”,因此我认为这应该是
Java.lang.Object
@Yuval:Doh-没有发现这一点。谢谢,修好了:)明白了!谢谢事实上,我有一个emun而不是“私有静态最终对象”,但这个想法似乎是一样的。@Marcus:我同意他们的观点-你的问题看起来像是这个问题的重复。你肯定还没有弄清楚为什么它不是复制品。