SS'*_*SS' 4 java multithreading hashmap java-8 java-stream
我有一个并行流,我正在使用Map来改变元素.
Map<Long, List<MyItem>> hashmap = foo.getMap();
itemStream.parallel()
.filter(Objects::nonNull)
.forEach(item -> setProperties(hashmap, item));
Run Code Online (Sandbox Code Playgroud)
方法'setProperties()'获取map和item,并执行get using item,然后设置项的一些属性.
我想要的是获取/属性设置以原子方式完成.这样两个线程就无法对相同的密钥执行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());
}
}
Run Code Online (Sandbox Code Playgroud)
还有点关注延迟命中以及这种并行化是否真的比现有的单线程方法更有优势.
同步地图或从中获取它没有任何好处,因为地图没有被改变,所以没有竞争条件.
您需要同步更新,以便它们一次性发生:
for (Object1 ob : items) {
synchronized (ob) {
ob.setId(item.getFloorId());
ob.setPath(item.getPath());
ob.setTypeName(item.getTypeName());
}
}
Run Code Online (Sandbox Code Playgroud)
这对性能影响很小,因为这些天同步引入的开销很小,只有在操作相同的项目时才会阻塞.
归档时间: |
|
查看次数: |
62 次 |
最近记录: |