线程安全在一个类

时间:2011-07-03 18:17:36

标签: java concurrency thread-safety

请您查看以下代码,并告知Class是否是线程安全的?如果它不是线程安全的,你能告诉它它在哪里断开吗?

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;

}

}

1 个答案:

答案 0 :(得分:3)

不,不是。

例如,两个线程可能无法通过players.contains测试并且都添加了他们的播放器版本(更好的方法是每次添加播放器到一组)。此外,除非Player.addScore是线程安全的,否则分数添加可能是错误的。

在整个play方法上进行同步(并将players还原为正常列表)可以解决这些问题。