Ключевое слово Volatile не работает должным образом с несколькими экземплярами класса [дубликат]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Ключевое слово Volatile не работает должным образом с несколькими экземплярами класса [дубликат]

Сообщение Anonymous »

Почти во всех сообщениях я читал, что изменчивая (даже если она не статичная) переменная является общей для всех потоков. Когда один поток обновляет переменную, второй поток получает обновленное значение. Однако когда я запускаю приведенный ниже код на своем локальном компьютере под управлением Java 7. Не дает ожидаемых результатов
Код:
public class StatciVolatile3 {

public static void main(String args[]) {
new ExampleThread2("Thread 1 ").start();
new ExampleThread2("Thread 2 ").start();
}

}

class ExampleThread2 extends Thread {
private volatile int testValue = 1;

public ExampleThread2(String str) {
super(str);
}

public void run() {
for (int i = 0; i < 3; i++) {
try {
System.out.println(getName() + " : " + i);
if (getName().compareTo("Thread 1 ") == 0) {
testValue++;
System.out.println("Test Value T1: " + testValue);
}
if (getName().compareTo("Thread 2 ") == 0) {
System.out.println("Test Value T2: " + testValue);
}
Thread.sleep(1000);
} catch (InterruptedException exception) {
exception.printStackTrace();
}
}
}
}

И результат:
Thread 2 : 0
Test Value T2: 1
Thread 1 : 0
Test Value T1: 2
Thread 2 : 1
Test Value T2: 1
Thread 1 : 1
Test Value T1: 3
Thread 2 : 2
Test Value T2: 1
Thread 1 : 2
Test Value T1: 4

Здесь, как мы видим, для потока T2 тестовое значение всегда равно 1. Почему это происходит?
Мой ожидаемый результат: оба потока видят обновленное значение
Thread 1 : 0
Test Value T1: 2
Thread 2 : 0
Test Value T2: 2
Thread 1 : 1
Test Value T1: 3
Thread 2 : 1
Test Value T2: 3
Thread 1 : 2
Test Value T1: 4
Thread 2 : 2
Test Value T2: 4


Подробнее здесь: https://stackoverflow.com/questions/306 ... of-a-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»