作者:天飞的鹊桥会大美女 | 来源:互联网 | 2022-12-09 17:48
我有一个并行流,我正在使用Map来改变元素.
Map> hashmap = foo.getMap();
itemStream.parallel()
.filter(Objects::nonNull)
.forEach(item -> setProperties(hashmap, item));
方法'setProperties()'获取map和item,并执行get using item,然后设置项的一些属性.
我想要的是获取/属性设置以原子方式完成.这样两个线程就无法对相同的密钥执行get操作并且交换属性更新.
private void setProperties(Map> map, Item item) {
long id = item.getID();
List items = map.get(id);
for (Object1 ob : items) {
ob.setId(item.getFloorId());
ob.setPath(item.getPath());
ob.setTypeName(item.getTypeName());
}
}
还有点关注延迟命中以及这种并行化是否真的比现有的单线程方法更有优势.
1> Bohemian..:
同步地图或从中获取它没有任何好处,因为地图没有被改变,所以没有竞争条件.
您需要同步更新,以便它们一次性发生:
for (Object1 ob : items) {
synchronized (ob) {
ob.setId(item.getFloorId());
ob.setPath(item.getPath());
ob.setTypeName(item.getTypeName());
}
}
这对性能影响很小,因为这些天同步引入的开销很小,只有在操作相同的项目时才会阻塞.
你能否说明一下"这几天同步引入了很少的开销"?我想知道更多.