我想弄清楚下面的代碼是否存在任何潛在的併發問題。具體而言,可見性問題與易變變量有關。 揮發性定義爲:這個變量的值將不會被緩存線程本地:所有讀取和寫入將直接進入「主內存」併發性,對象可見性
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()(這將會按順序發生而不是同時執行,因爲executor是單線程的),總會看到更新的test.state值?如果沒有,不退出Test.run()確保所做的任何更改使得線程在本地被寫回主內存?否則,當線程在本地進行更改時,如果線程退出時還沒有寫回主內存?
你從哪兒弄來該定義。聽起來像一個1.5 JMM之前的定義(這是不可實現的)。 –
http://www.javamex.com/tutorials/synchronization_volatile.shtml – Integer
認識到線程完成Test.run()時很重要,線程不會終止,並且任何有關由線程在終止之前刷新到主內存不適用。調用Test.run()的'run()'方法線程只是一個循環,它會阻塞,直到它接收到一個要執行的新任務。當該任務從*它的'run()'方法返回時,該線程將阻塞直到下一個任務;它不會終止(從而刷新其狀態)。 – erickson