Я пытаюсь выяснить, не страдает ли приведенный ниже код от каких-либо потенциальных проблем параллелизма. В частности, проблема видимости связана с изменчивыми переменными. 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 () каких-либо изменений, внесенных потоком локально, обратно в основную память? Иначе, когда изменения, сделанные потоком, локально записываются обратно в основную память, если нет при выходе из потока?