以下はコードhereのコードです。 プレイヤーがテーブルに参加できるオンラインゲームサーバーを模倣しています。ConcurrentHashMapの値はデフォルトで同期していますか?
public class GameServer {
public Map<String, List<Player>> tables = new ConcurrentHashMap<String, List<Player>>();
public void join(Player player, Table table) {
if (player.getAccountBalance() > table.getLimit()) {
List<Player> tablePlayers = tables.get(table.getId());
synchronized (tablePlayers) {
if (tablePlayers.size() < 9) {
tablePlayers.add(player);
}
}
}
}
public void leave(Player player, Table table) {/*Method body skipped for brevity*/}
public void createTable() {
Table table = new Table();
tables.put(table.getId(), table);
}
public void destroyTable(Table table) {
tables.remove(table.getId());
}
}
tablePlayersは、ConcurrentHashMapの値の1つです。
List<Player> tablePlayers = tables.get(table.getId());
ConcurrentHashMapはすでにスレッドセーフです。なぜ、それを使用するときに値オブジェクトを同期させる必要があるのですか?
synchronized (tablePlayers) {
...
}
これは2つの全く異なる質問です。 1つにこだわる。 – shmosel
* ConcurrentHashMapはすでにスレッドセーフです。なぜ、それを使用するには値オブジェクトを同期させる必要がありますか?**あなたは** **を使用していません。そこから値**を取得**しています。 ConcurrentHashMapはその値を保護せず、参照への*アクセス*を制御するだけです。参照を取得したら、安全に使うことはあなた次第です。 – shmosel