一尘不染

在lockObject上同步和将此作为锁之间有什么区别?

java

我知道同步方法和同步块之间的区别,但是我不确定同步块部分。

假设我有这段代码

class Test {
  private int x=0;
  private Object lockObject = new Object();

  public void incBlock() {
    synchronized(lockObject) {
      x++;
    }
    System.out.println("x="+x);
  }

  public void incThis() {  // same as synchronized method
    synchronized(this) {
      x++;
    }
    System.out.println("x="+x);
  }
}

在这种情况下,使用 lockObject 和将 用作锁之间有什么区别?对我来说似乎是一样的。

当您决定使用同步块时,如何确定哪个对象是锁?


阅读 273

收藏
2020-09-08

共1个答案

一尘不染

我个人几乎从不锁定“ this”。我通常锁定一个私有的引用,我知道没有其他代码可以锁定。如果您锁定“ this”,那么 任何
其他了解您对象的代码都可能选择锁定该对象。尽管这种情况不太可能发生,但它肯定可以实现-并可能导致死锁或仅仅是过度锁定。

关于锁定的内容,没有什么特别神奇的-您可以有效地将其视为令牌。任何使用相同令牌进行锁定的人都将尝试获取相同的锁定。除非您 希望
其他代码能够获取相同的锁,否则请使用私有变量。我 鼓励您创建变量final-我不记得 曾经 在对象的整个生命周期内更改过锁变量的情况。

2020-09-08