为了账号安全,请及时绑定邮箱和手机立即绑定

Executor 工作线程的 Java 内存一致性

Executor 工作线程的 Java 内存一致性

茅侃侃 2022-05-25 16:18:26
根据javadoc,实现Executor必须符合:内存一致性效果:在将 Runnable 对象提交给 Executor 之前,线程 ( A ) 中的操作发生在其执行开始之前,可能在另一个线程 ( B ) 中。由于我的英语很差,我不清楚B和随后由A提交给同一个 Executor 的另一个潜在线程C之间的内存一致性关系(如果有的话)。我希望下面的例子能澄清我的疑问。import java.util.concurrent.Executor;import java.util.concurrent.Executors;class ExecutorTestClass {    int a = 1;    volatile boolean isDone = false;    MyRunnable mr1 = new MyRunnable("One");    MyRunnable mr2 = new MyRunnable("Two");    class MyRunnable implements Runnable {    private final String name;    MyRunnable(String name) {        this.name = name;    }    @Override    public void run() {        System.out.println(name + ": " + ExecutorTestClass.this.a++);        isDone = true; // signal that addition has been performed        while (true) {        try {            Thread.sleep(5); // busy thread        } catch (InterruptedException e) {        }        }    }    }    public static void main(String[] args) {    ExecutorTestClass emc = new ExecutorTestClass();    Executor executor = Executors.newFixedThreadPool(2);    executor.execute(emc.mr1); // run the first MyRunnable    while (!emc.isDone) {    } // when stop spinning emc.a == 2 for this thread    executor.execute(emc.mr2); // is emc.a == 2 guaranteed?    }}保证emc.a == 2线程执行emc.mr2.run()?(在我的测试中这总是正确的,但是......是的,它们是测试)如果不是,官方 API 中是否有接口可以确保emc.a == 2?
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

不,不能保证,因为您emc.a在一个线程中更改值但从另一个线程提交Runnable。如果您在将第一个可运行对象设置为 2 之后从第一个可运行对象提交第二个可运行对象,则 JavaDoc 的内存一致性效果将适用。

但是在您的示例中,即使不考虑 JavaDoc 中的注释,volatile变量的使用也会起到作用。isDone由于您首先递增emc.a,然后将新值设置为isDone然后检查isDone它是否会在关系之前建立,并且第二个可运行将始终看到更新的值。


查看完整回答
反对 回复 2022-05-25
  • 1 回答
  • 0 关注
  • 61 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信