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
変更されることはありません。