Fra*_*rra 5 java-8 java-stream
我是Java 8的初学者.
对于具有一致的Java流行为,非干扰非常重要.想象一下,我们处理大量数据流,并在此过程中更改源.结果将是不可预测的.这与流并行或顺序的处理模式无关.
可以修改源,直到调用语句终端操作.除此之外,在流执行完成之前不应修改源.因此,处理流源中的并发修改对于获得一致的流性能至关重要.
以上引文取自此处.
有人可以做一些简单的例子来阐明为什么改变流源会产生如此大的问题吗?
那么oracle的例子在这里是不言自明的.首先是:
List<String> l = new ArrayList<>(Arrays.asList("one", "two"));
Stream<String> sl = l.stream();
l.add("three");
String s = l.collect(Collectors.joining(" "));
Run Code Online (Sandbox Code Playgroud)
如果在调用终端操作()之前l通过向其添加一个元素进行更改,则可以.但请注意,它由三个元素组成,而不是两个元素; 在您创建Stream via时.Collectors.joiningStreaml.stream()
另一方面这样做:
List<String> list = new ArrayList<>();
list.add("test");
list.forEach(x -> list.add(x));
Run Code Online (Sandbox Code Playgroud)
将抛出一个,ConcurrentModificationException因为你无法改变源.
现在假设您有一个可以处理并发添加的基础源:
ConcurrentHashMap<String, Integer> cMap = new ConcurrentHashMap<>();
cMap.put("one", 1);
cMap.forEach((key, value) -> cMap.put(key + key, value + value));
System.out.println(cMap);
Run Code Online (Sandbox Code Playgroud)
输出应该在这里?当我运行它时,它是:
{oneoneoneoneoneoneoneone=8, one=1, oneone=2, oneoneoneone=4}
Run Code Online (Sandbox Code Playgroud)
将键更改为zx(cMap.put("zx", 1)),结果现在是:
{zxzx=2, zx=1}
Run Code Online (Sandbox Code Playgroud)
结果不一致.
| 归档时间: |
|
| 查看次数: |
352 次 |
| 最近记录: |