【发布时间】:2017-02-18 13:26:27
【问题描述】:
考虑sn-p:
如果在主线程中,我在 方法-
中有这个volatile CountDownLatch latch = new CountDownLatch(3);
new Thread(new ProcessThread("Worker1",latch, 20000)).start();//20 secs
new Thread(new ProcessThread("Worker2",latch, 60000)).start();//60 secs
new Thread(new ProcessThread("Worker3",latch, 40000)).start();//40 secs
我看到volatile 显示为非法修饰符。并且只允许final。 最终保证初始化安全。
public static class ProcessThread implements Runnable {
final CountDownLatch latch;
final long workDuration;
final String name;
public ProcessThread(String name, CountDownLatch latch, long duration){
this.name= name;
this.latch = latch;
this.workDuration = duration;
}
}
下面的对象,即new CountDownLatch(3) 是正确构造的,但我还想确保上面的对象分配到的引用latch 保证对其下面的代码可见。
final CountDownLatch latch = new CountDownLatch(3);
上面的代码是否保证初始化,以便latch对下面的代码完全可见,即
new Thread(new ProcessThread("Worker1",latch, 20000)).start();
【问题讨论】:
-
有点不清楚你在问什么。当你最后说“对下面的代码完全可见,即”你的意思是你引用的代码行,对构造函数的调用? (我意识到这可能很明显。)或者代码在构造函数中?
-
@T.J.Crowder 构造函数中的代码肯定是在与构造函数调用相同的线程中执行的......?这是
run()方法,它(可能)在不同的线程中运行。 -
@AndyTurner:当然可以,我并没有提出其他建议。我建议 OP 澄清他的要求,特别是考虑到在本地使用
volatile。
标签: java multithreading volatile final