Comments 8
Пишите коментарии или дополнения!
Возможно я что-то упускаю, но не могу понять, как в Вашем примере проверялась работа volatile, у меня всё равно проскакивает то тут, то там значение 0. Мой код ниже:
Hidden text
public class Example {
volatile int x; // общий для всех потоков ресурс
public void exec() {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
x = 1; // параллельно изменяет общий ресурс
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
x = 2; // параллельно изменяет общий ресурс
}
});
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(x); // параллельно читает общий ресурс
}
});
thread1.start();
thread2.start();
thread3.start();
}
}
public class Main {
public static void main(String[] args) throws NoSuchMethodException {
while(true) {
Example example = new Example();
example.exec();
}
}
}
Добрый день, компилятор в реализации виртуальной машины Java может изменить порядок кода или процессора. Кроме того, иерархия памяти архитектуры, на которой выполняется реализация виртуальной машины Java, может создавать впечатление, что код переупорядочивается.
В вашем случае скорее всего проблема в том, что JMV делает reordering и thread3.start() выполняется первым.
-
Ну так она и должна выводить либо 0, либо 1, либо 2. Все правильно.
Data Race проще продемонстрировать на двух переменных:
int x = 0;
int y = 0;
thread1 {
x = 1;
y = 1;
}
thread2 {
if (y > 0) {
print(x);
}
}
В этом варианте нельзя утверждать, что второй поток выведет единицу, так как процессор может переставить местами операции записи в память.
Спасибо за статью, есть одно замечание. Отсутствуют обяснения к примерам, даже в том же примере в дата рейсом и валатайл не написано почему не правильно, что неправильно и как повлияет на работу программы добавление валатайл. ну тоесть вот вы пишите:
у нас код.
он работаешь сейчас неправильно.
добавляем валатайл.
теперь правильно.
А только пример не обьясняется, просто есть код и как он неправильно будет работать и как это исправит валатайл не написано, хотя пример должен как бы обьяснять как и почему там что то неправильно происходит, какое то возвращаемое значение не то или как потоки будут работать с ресурсом, перезаписывать нам этот ресурс не в такой то последовательности или не так как нам надо, вот я о чём. старался более конструктивно все обьяснить, надеюсь вы этот момент учтете)
Разница между Data Race и Race Condition