В программе сложные вычисления выполняются в отдельном потоке:
public class MyThread extends Thread {
private volatile boolean running = false;
public void setRunning(boolean run) {
running = run;
}
...
}
Переменная (поле) running используется для управления выполнения потока (в методе run() ). Поле running имеет только сеттер (setRunning() ). Т.е., другие потоки не могут получать значение этой переменной / не зависят от неё. Сам метод setRunning() вызывается из основного потока и, соответственно, выполняется в основном потоке, а не в потоке MyThread. Поэтому возможен случай, когда потоки выполняются на разных ядрах процессора, и при выполнении метода setRunning() в основном потоке / на одном ядре, переменная running может(?) кэшироваться в кэш-памяти этого ядра процессора: http://tutorials.jenkov.com/java-concurrency/volatile.html. Хотя переменная running принадлежит потоку MyThread, ей незачем кэшироваться в кэш-памяти этого ядра, на котором выполняется основной поток. Тем временем, на другом ядре, поток MyThread может прочитать значение переменной running, которая не синхронизирована. Или такое не может произойти?
- Так, нужно ли объявлять переменную running (которая private и без геттера) как volatile?
P. S. private volatile fields without getters -> частные Летучие поля без добытчиков — © Google Translate :)