ExecutorServiceのからのスレッドはローカルで宣言同時ハッシュマップを更新するために保証されるのでしょうか?

howly:
public void test() {

    List<Integer> integers = new ArrayList<>();
    for(int i = 0; i < 1000; i++) {
        integers.add(i);
    }

    Map<Integer, Integer> cache = new ConcurrentHashMap<>();
    ExecutorService pool = new ForkJoinPool(10);
    try {
        pool.submit(() -> integers.parallelStream().forEach(integer -> {
            String name = Thread.currentThread().getName();
            System.out.println("Foo " + name);
            cache.put(integer, integer);
        })).get();
    } catch (Exception e) {

    }

    System.out.println(cache);
}

私はあなたが変数への更新を他のスレッドに予想どおりに伝播されるように揮発性の変数を持っている必要がありますことをお読みください。http://tutorials.jenkov.com/java-concurrency/volatile.html#variable-visibility-problems

それはローカル変数ではないインスタンス変数であるため、この試験方法では、私は、「揮発性」変数と「キャッシュ」同時ハッシュマップを宣言することはできません。コードはのSystem.out.println(キャッシュ)ラインになると、それは私のメインスレッドがExecutorServiceのスレッドで「キャッシュ」に追加されたすべての値を見ることが保証されますか?

とりこエリュシオン:

はい、あなたのコードは正常に動作します。ConcurrentHashMapすべての挿入マッピングは、スレッドセーフな方法で起こることを保証します。

あなたは気にする必要はありませんpoolし、cache-彼らは効果的に、最終的な変数だし、(あなたが任意のマルチスレッドコードを開始する前に)のような、それらの値は、建設時に設定したら、もう変更されません。

何を混乱することができることは非finalフィールドを扱うときのように、あなたがそれらをマークする必要があるかもしれないということであるvolatileあなたがそれらを変更すると、変更が正しくスレッド全体に伝播されていることを確認するつもりであれば。上記の言ったようしかし、通知はどのようにこのケースでの値poolとはcaches変更されることはありません。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=457596&siteId=1