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)
我们如何决定在哪种情况下应该使用哪一个?
编辑:
我已经编辑了我的帖子标题和帖子以证明这不是重复.谢谢.
在我回答你的问题之前,请注意void方法不能返回ArrayList.
问题是:他们获得的锁定不同.
在这种情况下,第一个是对"this"的隐式锁定.这是一种写作方式
public void getPlayers() {
synchronized (this) {
return list;
}
}
Run Code Online (Sandbox Code Playgroud)
除了它是一个方法修饰符.
在第二个示例中,您显式锁定要返回的ArrayList.这与竞争锁定相同,使用更局部化的粒度切换实例锁定.
在第三个示例中,您锁定了Class.这通常是静态方法的首选,其中无法获取实例(尝试它,不能使用"this"作为值).它几乎等同于锁定静态的最终Object字段,因为Class对象理论上不应该改变.
| 归档时间: |
|
| 查看次数: |
448 次 |
| 最近记录: |