如果我们正在开发多核处理器,我们需要将这些核心的缓存同步,如果任务被划分并分发到不同的核心来处理。 Java 8 Stream库如何实现这一目标?在Java 8 Stream并行处理期间,是否同步了所有处理器核心的缓存?
答案 0 :(得分:1)
这是Java Memory Model的保证之一。只要您的程序正确同步(通过synchronized
,Lock
或其他形式的同步),您的共享内存将对所有线程可见。
并不是说缓存会同步,#34;但是在访问正确同步的变量之前会重新加载它们,并在写入正确同步的变量时刷新它们。
JLS §17.4.3
在顺序一致的执行中,存在总订单 在所有个别动作(例如读取和写入)中 符合程序的顺序和每个单独的动作 是原子的,每个线程都可以立即看到。
JLS §17.3
重要的是要注意
Thread.sleep
和Thread.yield
都不是 有任何同步语义。特别是编译器 不必将寄存器中缓存的写入刷新到共享内存 在调用Thread.sleep
或Thread.yield
之前,编译器也没有 调用Thread.sleep
后必须重新加载缓存在寄存器中的值 或Thread.yield
。