Я изучаю изменчивую переменную. Я знаю, что такое volatile, я написал образец программы для переменной volatile, но не работал, как ожидалось.Java volatile ключевое слово не работает как ожидалось
Почему конечное значение «счетчик» наступающем-то меньше, чем 2000. Я использовал неустойчивыми, следовательно, система не должна кэшировать «считать» переменной и значение всегда должно быть 2000.
Когда я использовал синхронизированный метод работает нормально, но не в случае ключевого слова volatile.
public class Worker {
private volatile int count = 0;
private int limit = 10000;
public static void main(String[] args) {
Worker worker = new Worker();
worker.doWork();
}
public void doWork() {
Thread thread1 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < limit; i++) {
count++;
}
}
});
thread1.start();
Thread thread2 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < limit; i++) {
count++;
}
}
});
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException ignored) {}
System.out.println("Count is: " + count);
}
}
Благодарю вас заранее!
летучие и синхронизированные не то же самое ... используйте Atomic вместо этого .... –
* «Я знаю, что такое неустойчивое» * Не обижайтесь, но этот вопрос доказывает иначе. – Tom
«Я использовал volatile, поэтому система не должна кэшировать переменную« count », кроме состояния гонки (очевидная проблема здесь) это совершенно неправильно. Volatile не останавливает процессор от кеширования значений в памяти - даже не сказать, что современные процессоры могут делать такие вещи, потому что это было бы бессмысленно. Volatile делает что-то совсем другое, и вы действительно не должны использовать его, не понимая, какие гарантии памяти и гарантии видимости (и после того, как вы это понимаете, вы заметите, что есть более качественные решения высокого уровня). – Voo