我試圖證明使用普通Map
有多個並行任務的問題。下面的例子(編譯和運行)旨在展示Map
失敗:顯示一個非併發地圖下的多線程打破
import java.util.*;
import java.util.stream.*;
import java.util.concurrent.*;
class BreakMap2 implements Runnable {
private Map<Integer, Integer> map;
public BreakMap2(Map<Integer, Integer> map) {
this.map = map;
}
@Override
public void run() {
while(true) {
int key = ThreadLocalRandom.current().nextInt(10_000);
if(map.containsKey(key)) {
assert map.get(key) == key;
}
map.put(key, key);
}
}
}
public class MapBreaker2 {
public static void main(String[] args) {
Map<Integer, Integer> map = new HashMap<>();
IntStream.range(0, 1000)
.mapToObj(i -> new BreakMap2(map))
.map(CompletableFuture::runAsync)
.collect(Collectors.toList())
.forEach(CompletableFuture::join);
}
}
這並不說明問題(它不會失敗)。我怎樣才能更有效地做到這一點?有沒有一種方法可以快速而可靠地失敗?
爲了澄清,我想表明它是如何的不安全有多個任務寫入未被設計爲同時使用一個Map
。我正在嘗試創建一些由於併發訪問而顯示錯誤寫入Map
的內容。
編輯:我已經簡化了這個例子,現在它只是運行直到你點擊Control-C。我想要的是沒有停止該計劃。
看起來像它的使用大小爲1的線程池 – bdkosher
你的例子看起來過於複雜。究竟想要展示什麼? –
問題是什麼?你想要顯示一個非併發映射在多線程下不起作用嗎?這不是一個問題,而是一個碰撞牆受損的汽車 - 這是衆所周知的和記錄。 – TomTom