同步 - 锁之间的差异

时间:2014-08-07 04:50:25

标签: java multithreading

以下锁定并发方法之间有什么区别?

public synchronized ArrayList<Player> getPlayers() {
     return players;
}

public ArrayList<Player> getPlayers() {
     synchronized(players) {
          return players;
     }
}

public ArrayList<Player> getPlayers() {
     synchronized(GameHandler.class) {
          return players;
     }
}

我们如何决定在哪种情况下应该使用哪一种?

编辑:

我已经编辑了我的帖子标题和帖子以证明这不是重复。谢谢。

1 个答案:

答案 0 :(得分:7)

在我回答你的问题之前,请注意,void方法不能返回ArrayList。

问题是:他们获得的锁定不同。

在这种情况下,第一个是对“this”的隐式锁定。这是一种写作方式

public void getPlayers() {
    synchronized (this) {
        return list;
    }
}

除了它是一个方法修饰符。

在第二个示例中,您显式锁定要返回的ArrayList。这在争用锁中很常见,使用更局部化的粒度切换实例锁。

在第三个示例中,您锁定了Class。这通常是静态方法的首选,其中无法获取实例(尝试它,不能使用“this”作为值)。它几乎等同于锁定静态的最终Object字段,因为Class对象理论上不应该改变。