Java内存模型发生在线程池交互的保证之前

Pav*_*vel 6 java java.util.concurrent java-memory-model

Java内存模型是否为Thread Pool交互提供了先前发生的保证?特别是,在工作队列中运行项目结束之前由线程池工作线程进行的写入是否会在之后从队列中运行下一个项目的工作线程可见?

规范(我个人觉得这个常见问题解答很有用:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#synchronization)声明"对a的调用start()线程在启动线程中的任何操作之前发生. "或者简单地说,在启动线程之前所做的任何内存写入都将在执行之前执行并且对run()方法可见.对于线程池,它是不同的,start()通常在您进行写入之前运行.考虑一个简单的工作流,其中上下文对象被变异并传递给下一个动作:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {

    private static class Container<T> {
        private T value;
        public T get() {
            return value;
        }
        public void set(T newValue) {
            value = newValue;
        }
    }

    public static void main(String[] args) {
        final Container<Integer> sharedObject = new Container<>();
        final ExecutorService executor = Executors.newFixedThreadPool(10);
        // SKIPPED: pre-warm the executor so all worker threads are start()'ed
        final Runnable read = () -> System.out.println("Got " + sharedObject.get());
        Runnable write = () -> {
            sharedObject.set(35);
            executor.execute(read);
        };
        executor.execute(write);
        // SKIPPED: wait until done
    }
}
Run Code Online (Sandbox Code Playgroud)

是写于sharedObject.value通过write.run()保证是可见(不询问订货,这是显而易见的)来read.run()

(PS:据我所知,制作value volatile确实提供了这种保证)

更新(补充答案): 包摘要文档java.util.concurrent总结了语言提供的内容一致性保证,并由框架扩展:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package -summary.html#MemoryVisibility

Ste*_*n C 6

我认为它保证是可见的. ExecutorService扩展Executorjavadoc文档Executor说:

内存一致性效果:在提交Runnable对象之前的一个线程中的操作Executor - 在执行开始之前 -可能在另一个线程中.

通过我的阅读,这与你的例子中的内容相符.将write可运行在提交read可运行的,所以就有了之前发生的事件之间的关系,在提交之前,write线程(即set调用)和事件后的read线程(即get调用).

writerunnable本身就是一个提交的事实意味着在创建对象和调用之间也会发生.Containerset