- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
考虑这个(完全人为的)Java 代码:
final List<Integer> s = Arrays.asList(1, 2, 3);
final int[] a = new int[1];
a[0] = 100;
s.parallelStream().forEach(i -> {
synchronized (a) {
a[0] += i;
}
});
System.out.println(a[0]);
这段代码能保证输出“106”吗?
似乎不是,除非有一个发生在之前的关系由parallelStream()
建立, 通过它我们可以确定第一个访问 a[0]
在 lambda 中会看到 100
而不是零(根据我对 Java 内存模型的理解)。
但是Collection.parallelStream()
没有记录建立这种关系...
完成 parallelStream()
可以问同样的问题方法调用。
那么我是不是遗漏了什么,或者为了正确性,上面的代码是否需要看起来像这样:
final List<Integer> s = Arrays.asList(1, 2, 3);
final int[] a = new int[1];
synchronized (a) {
a[0] = 100;
}
s.parallelStream().forEach(i -> {
synchronized (a) {
a[0] += i;
}
});
synchronized (a) {
System.out.println(a[0]);
}
或者... parallelStream()
实际上提供了这些happens-before 关系,而这只是缺少一些文档的问题?
我问是因为从 API 设计的角度来看,这似乎(至少对我而言)是合乎逻辑的事情......类似于 Thread.start()
等
最佳答案
您真的应该避免在管道“外部”使用变量。即使你让它正常工作,性能也可能会受到影响。 JDK 中内置了很多工具来实现这一点。例如,您的用例可能更安全,例如:
Integer reduce = IntStream.of(1, 2, 3)
.parallel()
.reduce(100, (accumulator, element) -> accumulator + element);
关于java - Collection.parallelStream() 是否暗示发生在关系之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53906027/
我需要在我的网站中实现自动建议功能,并且我需要一些易于开发或编辑的 java 脚本框架或代码,并且自动建议将是多个字段 最佳答案 适配 jQuery:http://jqueryui.com/ 关于ja
在下面的示例中,SonarQube 提示 model.toString() 是 not null 并且 (model == null) 始终 false,需要一些帮助来了解可以采取哪些措施来修复它。因
我正在尝试创建自定义 iOS 键盘。我使用 UILexicon 类来提供 requestSupplementaryLexiconWithCompletion: 方法提供的基本词库。 但我也想将预测文本
如何断言如果 X 为 true 那么 Y 也为 true。问题是,如果我写以下内容: assert(X && Y && "If X is true then Y should be true too.
创建路径中包含两个反斜杠的文件时,是否会产生任何不可预见的后果。 在此代码中,文件创建正常,但我想知道在使用此文件的过程中是否有任何副作用。 HANDLE hFile = CreateFile(
在下面的示例中,SonarQube 提示 bookmark 可能为 null 或为 null,需要一些帮助来了解可以采取哪些措施来修复它。因为 bookmark 在 for 循环中被初始化为变量,并且
这个问题在这里已经有了答案: Partial ordered Comparator (6 个答案) 关闭 8 年前。 我有一组序列化到文件中的项目。有些项目可以依赖其他项目,但不允许循环引用。因此,
我想创建将始终使用 gcc/g++/clang 支持的 C/C++ 标准的“最新”版本的 shell 别名/clang++(C的一个别名,C++的一个别名)。我意识到这可能有多种解释: 最新的 GNU
我是一名优秀的程序员,十分优秀!