我在想如何同步下面的多線程,以便我仍然可以並行運行線程而不會導致保存多個對象。如何同步多線程映射更新
public void setupRender() {
ExecutorService executorService = Executors.newFixedThreadPool(10);
final Map<Integer, String> map = Collections.synchronizedMap(new HashMap<Integer, String>());
for (int i = 0; i < 10; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
parse(map);
}
});
System.out.println("map size " + map.size() + " loop " + i);
}
}
public void parse(Map<Integer, String> map) {
for (int j = 0; j < 100; j++) {
if (map.containsKey(j)) {
System.out.println("Update");
//session.update(map.getKey(j));
} else {
System.out.println("add to map " + j);
String obj = "test";
map.put(j, obj);
System.out.println("save");
//session.save(obj);
}
if (j % 50 == 0) {
System.out.println("commit");
//tx.commit();
}
}
}
結果,請注意同一個密鑰的多個對象添加到地圖中,但更糟糕的是保存到導致重複數據庫enteries數據庫。
map size 0 loop 0
map size 0 loop 1
add to map 0
commit
add to map 1
add to map 0
commit
add to map 2
add to map 3
add to map 4
add to map 2
add to map 5
add to map 6
map size 1 loop 2
add to map 7
add to map 8
add to map 9
commit
map size 10 loop 3
commit
add to map 5
你可以只設置在DB驅動程序的事務隔離級別? – MadConan
當db僅僅將它看作是一個全新的對象時,我不明白這是如何工作的。 –