以下锁定并发方法之间有什么区别?
public synchronized ArrayList<Player> getPlayers() {
return players;
}
public ArrayList<Player> getPlayers() {
synchronized(players) {
return players;
}
}
public ArrayList<Player> getPlayers() {
synchronized(GameHandler.class) {
return players;
}
}
我们如何决定在哪种情况下应该使用哪一种?
编辑:
我已经编辑了我的帖子标题和帖子以证明这不是重复。谢谢。
答案 0 :(得分:7)
在我回答你的问题之前,请注意,void方法不能返回ArrayList。
问题是:他们获得的锁定不同。
在这种情况下,第一个是对“this”的隐式锁定。这是一种写作方式
public void getPlayers() {
synchronized (this) {
return list;
}
}
除了它是一个方法修饰符。
在第二个示例中,您显式锁定要返回的ArrayList。这在争用锁中很常见,使用更局部化的粒度切换实例锁。
在第三个示例中,您锁定了Class。这通常是静态方法的首选,其中无法获取实例(尝试它,不能使用“this”作为值)。它几乎等同于锁定静态的最终Object字段,因为Class对象理论上不应该改变。