繁体   English   中英

class 中的线程安全

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM