Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类中的线程安全_Java_Concurrency_Thread Safety - Fatal编程技术网

Java 类中的线程安全

Java 类中的线程安全,java,concurrency,thread-safety,Java,Concurrency,Thread Safety,请看一下下面的代码,并建议ClassA是否是线程安全的?如果它不是螺纹安全的,你能告诉我它在哪里断裂吗 public class ClassA { private List<Player> players; public ClassA() { this.players = Collections.synchronizedList(new ArrayList<Player>()); } public Player play(Player player){ int sc

请看一下下面的代码,并建议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;

}

}
公共类ClassA{
私人名单玩家;
公共甲级(){
this.players=Collections.synchronizedList(新的ArrayList());
}
公共玩家游戏(玩家){
智力得分=0;
.
.
.
if(player.contains(player)){
player=players.get(players.indexOf(player));
player.addScore(score);
}否则{
player.addScore(score);
players.add(player);
}
返回球员;
}
}
不,不是

例如,两个线程可能无法通过
player.contains
测试,并且两个线程都会添加其版本的播放器(更好的方法是每次将播放器添加到一个集合中)。此外,除非
Player.addScore
是线程安全的,否则添加分数可能会有微妙的错误

在整个
play
方法中进行同步(并将
玩家
恢复到正常列表)可以解决这些问题