2

以下のコードは、java.util.ConcurrentModificationException. これを防止または許可する方法はありますか?

public void saveHomes() throws IOException {
    BufferedWriter br;
    br  = new BufferedWriter(new FileWriter(homeFile));
    Map<String, Location> homesLoc;

    System.out.println(homes2.keySet());
    for (String player : homes2.keySet()) {
        homesLoc = homes2.get(player);
        for (String name : homesLoc.keySet()) {
            br.write(player + " " + homesLoc.get(name) + " " + name);
            br.newLine();
            br.flush();
        }
    }

    br.close();
}
4

5 に答える 5

3

これはすでに発明されているホイールです。

使うConcurrentHashMap

(非スレッドセーフ)の代わりにそれを使用するとHashMap、同時実行性の問題が解消されます。

于 2013-05-03T02:24:58.997 に答える
1

「Java Collection クラスはフェイルファストです。つまり、スレッドが iterator を使用してコレクションをトラバースしている間に Collection が変更されると、iterator.next() は ConcurrentModificationException をスローします。」

homesLoc を変更してからトラバースしています。

于 2013-05-03T02:50:17.687 に答える
-1

ハッシュマップを反復しているだけなので、これにハッシュマップを使用する必要はないと思いますが、Javaではハッシュテーブルが同期されるため、同時アクセスの問題が解消されます。

于 2013-05-03T02:23:37.753 に答える
-1

java.util.Iteratorキーセットを反復するには、を使用する必要があります。これにより、java.util.ConcurrentModificationException

コード:

public void saveHomes() throws IOException {
    BufferedWriter br;
    br  = new BufferedWriter(new FileWriter(homeFile));
    Map<String, Location> homesLoc;

    System.out.println(homes2.keySet());
    Iterator<String> players = homes2.keySet().iterator();

    while (players.hasNext()) {
        String player = players.next();
        homesLoc = homes2.get(player);

        Iterator<String> names = homesLoc.keySet().iterator();
        while (names.hasNext()) {
            String name = names.next();
            br.write(player + " " + homesLoc.get(name) + " " + name);
            br.newLine();
            br.flush();
        }
    }

    br.close();
}
于 2013-05-03T03:33:47.143 に答える