我有一個并行流,其中我使用 Map 來改變元素。Map<Long, List<MyItem>> hashmap = foo.getMap();itemStream.parallel() .filter(Objects::nonNull) .forEach(item -> setProperties(hashmap, item));方法“setProperties()”獲取地圖和項目,并使用項目執(zhí)行獲取,然后設(shè)置項目的一些屬性。我想要的是以原子方式完成獲取/屬性設(shè)置。這樣兩個線程就不能對同一個鍵執(zhí)行 get 并且屬性更新是交錯的。private void setProperties(Map<Long, List<Item>> map, Item item) { long id = item.getID(); List<Object1> items = map.get(id); for (Object1 ob : items) { ob.setId(item.getFloorId()); ob.setPath(item.getPath()); ob.setTypeName(item.getTypeName()); }}也有點擔(dān)心延遲命中以及這種并行化是否真的比現(xiàn)有的單線程方法有好處。
1 回答

皈依舞
TA貢獻(xiàn)1851條經(jīng)驗 獲得超3個贊
同步地圖或從中獲取沒有任何好處,因為地圖沒有被改變,所以沒有競爭條件。
您需要同步更新,以便它們一次性發(fā)生:
for (Object1 ob : items) {
synchronized (ob) {
ob.setId(item.getFloorId());
ob.setPath(item.getPath());
ob.setTypeName(item.getTypeName());
}
}
這對性能的影響很小,因為現(xiàn)在同步引入的開銷非常小,并且只有在操作相同的Item時才會阻塞。
添加回答
舉報
0/150
提交
取消