【发布时间】:2015-08-05 09:10:26
【问题描述】:
如果我们正在开发多核处理器,如果任务被划分并分配到不同的核心来处理,我们需要这些核心的缓存保持同步。 Java 8 Stream 库如何实现这一点? Java 8 Stream 并行处理时所有处理器核心的缓存是否同步?
【问题讨论】:
标签: java parallel-processing synchronization java-8 java-stream
如果我们正在开发多核处理器,如果任务被划分并分配到不同的核心来处理,我们需要这些核心的缓存保持同步。 Java 8 Stream 库如何实现这一点? Java 8 Stream 并行处理时所有处理器核心的缓存是否同步?
【问题讨论】:
标签: java parallel-processing synchronization java-8 java-stream
这是Java Memory Model 的保证之一。只要您的程序正确同步(通过synchronized、Lock 或其他形式的同步),您的共享内存将对所有线程可见。
并不是说缓存会“同步”,而是在访问正确同步的变量之前重新加载它们,并在写入正确同步的变量时刷新。
JLS§17.4.3
在顺序一致的执行中,有一个总顺序 在所有单个操作(例如读取和写入)上 与程序的顺序一致,以及每个单独的动作 是原子的,并且对每个线程都立即可见。
JLS§17.3
需要注意的是,
Thread.sleep和Thread.yield都不是 有任何同步语义。特别是,编译器确实 不必将缓存在寄存器中的写入刷新到共享内存 在调用Thread.sleep或Thread.yield之前,编译器也不会 调用Thread.sleep后必须重新加载缓存在寄存器中的值 或Thread.yield。
【讨论】:
findXXX methods 使用 an AtomicReference 进行同步。