同步 - 锁之间的差异

0-4*_*23o -9 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;
     }
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

Bre*_*eze 7

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

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

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

public void getPlayers() {
    synchronized (this) {
        return list;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在第二个示例中,您显式锁定要返回的ArrayList.这与竞争锁定相同,使用更局部化的粒度切换实例锁定.

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

  • 我作为一个巨魔的工作不是巨魔,那就是巨魔:P (3认同)