[英]Thread-Safety in a class
请你看看下面的代码并告诉你 ClassA 是否是线程安全的? 如果它不是线程安全的,您能否告知它在哪里中断?
public class ClassA {
private List<Player> players;
public ClassA() {
this.players = Collections.synchronizedList(new ArrayList<Player>());
}
public Player play(Player player){
int score = 0;
.
.
.
if (players.contains(player)) {
player = players.get(players.indexOf(player));
player.addScore(score);
} else {
player.addScore(score);
players.add(player);
}
return player;
}
}
不它不是。
例如,两个线程可能无法通过players.contains
测试并且都添加他们的播放器版本(更好的方法是每次都将播放器添加到集合中)。 此外,除非Player.addScore
是线程安全的,否则分数添加可能会出现微妙的错误。
同步整个play
方法(并将players
器恢复到正常列表)将解决这些问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.