作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请您看一下下面的代码并告知 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
恢复为正常列表)将解决这些问题。
关于java - 类中的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6564679/
我是一名优秀的程序员,十分优秀!