我试图弄清楚下面的代码是否存在任何潜在的并发问题。具体来说,与易失性变量相关的可见性问题。Volatile被定义为:这个变量的值永远不会被缓存在线程本地:所有的读写都将直接进入“主内存”
public static void main(String [] args)
{
Test test = new Test();
// This will always single threaded
ExecutorService ex = Executors.newSingleThreadExecutor();
for (int i=0; i<10; ++i)
ex.execute(test);
}
private static class Test implements Runnable {
// non volatile variable in question
private int state = 0;
@Override
public void run() {
// will we always see updated state value? Will updating state value
// guarantee future run's see the value?
if (this.state != -1)
this.state++;
}
}
对于上面的单线程执行器:
可以使test.state非易失性吗?换句话说,每个连续的 Test.run()(这将顺序发生而不是同时发生,因为再次执行程序是单线程的),总是看到更新的test.state值?如果不是,退出Test.run()是否不会确保在本地对线程所做的任何更改都写回主内存?否则,如果不是在线程退出时,本地所做的更改何时会被写回主内存?