【问题标题】:Do the caches of all processor's cores are synchronized during Java 8 Stream parallel processing?Java 8 Stream 并行处理期间所有处理器内核的缓存是否同步?
【发布时间】:2015-08-05 09:10:26
【问题描述】:

如果我们正在开发多核处理器,如果任务被划分并分配到不同的核心来处理,我们需要这些核心的缓存保持同步。 Java 8 Stream 库如何实现这一点? Java 8 Stream 并行处理时所有处理器核心的缓存是否同步?

【问题讨论】:

    标签: java parallel-processing synchronization java-8 java-stream


    【解决方案1】:

    这是Java Memory Model 的保证之一。只要您的程序正确同步(通过synchronizedLock 或其他形式的同步),您的共享内存将对所有线程可见。

    并不是说缓存会“同步”,而是在访问正确同步的变量之前重新加载它们,并在写入正确同步的变量时刷新。

    JLS§17.4.3

    在顺序一致的执行中,有一个总顺序 在所有单个操作(例如读取和写入)上 与程序的顺序一致,以及每个单独的动作 是原子的,并且对每个线程都立即可见。


    JLS§17.3

    需要注意的是,Thread.sleepThread.yield 都不是 有任何同步语义。特别是,编译器确实 不必将缓存在寄存器中的写入刷新到共享内存 在调用Thread.sleepThread.yield 之前,编译器也不会 调用Thread.sleep 后必须重新加载缓存在寄存器中的值 或Thread.yield

    【讨论】:

    • 是的,你是对的,但我现在想了解 Stream 并行处理案例中实际发生的情况,因为我们在这里没有使用同步、锁定或其他形式的同步。
    • @VineetTyagi Stream API 正在内部同步。
    • @VineetTyagi 例如,findXXX methods 使用 an AtomicReference 进行同步。
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2018-11-19
    • 2023-01-16
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    相关资源
    最近更新 更多