"引用"或实例上的同步

Lop*_*tun 19 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++;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 19

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

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