Java 在执行人担保之前发生。提交()

Java 在执行人担保之前发生。提交(),java,java-memory-model,happens-before,Java,Java Memory Model,Happens Before,他说: 内存一致性影响:在将Runnable对象提交给Executor之前,线程中的操作发生在其开始执行之前,可能发生在另一个线程中 Java语言规范的哪一部分保证了这一点?还是仅仅因为实现使用了一些内部同步?(如果是这样的话,最好举个例子。)因此,在实现自定义执行器时,我是否应该知道这个要求?JLS没有指定API。它指定了语言。javadoc是API规范 因此,是的,如果要实现一个Executor,最好遵守Executor接口的规范。执行者必须注意提交发生在任务执行之前。这种情况不会自行发生。

他说:

内存一致性影响:在将
Runnable
对象提交给
Executor
之前,线程中的操作发生在其开始执行之前,可能发生在另一个线程中


Java语言规范的哪一部分保证了这一点?还是仅仅因为实现使用了一些内部同步?(如果是这样的话,最好举个例子。)因此,在实现自定义
执行器时,我是否应该知道这个要求?

JLS没有指定API。它指定了语言。javadoc是API规范


因此,是的,如果要实现一个Executor,最好遵守Executor接口的规范。执行者必须注意提交发生在任务执行之前。这种情况不会自行发生。需要同步(等待/通知、volatile写入/读取等)。

好吧,javadoc指定了它。JLS没有指定API。它指定了语言。是的,如果你要实现一个执行器,你最好遵守执行器接口的规范。好的,一般来说,这种语言确实保证线程受限的代码以顺序方式执行。在单线程应用程序中,不可能建立任何先发制人的关系,否则根本就不可能建立任何先发制人的关系。因此,上面的语句不需要内存模型的任何规范(内存模型处理线程之间可变数据的可见性和一致性)。以上只是强化了一种观念,即提交之前的代码将在提交开始执行之前执行(即使在另一个线程中)。@scottb我不同意。例如,如果工作线程连续轮询一个新任务的ArrayList,那么在保证之前不会发生任何事件:工作线程可以在列表中看到一个新项目,但状态不一致。因此,执行者必须小心提供保证(同步等)。我不认为线程限制与这个问题有什么关系:OP要求从线程A向将在线程B中执行任务的执行者提交任务。执行者必须注意提交发生在任务执行之前。这种情况不会自行发生。需要同步(等待/通知、易失性写入/读取等)。@JBNizet-您的评论应该是答案…:-)