Как стать автором
Обновить

Комментарии 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() выполняется первым.

Да даже без reordering нет никаких гарантий в каком порядке будут выполняться треды.

Ну так она и должна выводить либо 0, либо 1, либо 2. Все правильно.

Data Race проще продемонстрировать на двух переменных:

int x = 0;
int y = 0;
thread1 {
  x = 1;
  y = 1;
}
thread2 {
  if (y > 0) {
    print(x);
  }
}

В этом варианте нельзя утверждать, что второй поток выведет единицу, так как процессор может переставить местами операции записи в память.

Спасибо за статью, есть одно замечание. Отсутствуют обяснения к примерам, даже в том же примере в дата рейсом и валатайл не написано почему не правильно, что неправильно и как повлияет на работу программы добавление валатайл. ну тоесть вот вы пишите:

у нас код.

он работаешь сейчас неправильно.

добавляем валатайл.

теперь правильно.

А только пример не обьясняется, просто есть код и как он неправильно будет работать и как это исправит валатайл не написано, хотя пример должен как бы обьяснять как и почему там что то неправильно происходит, какое то возвращаемое значение не то или как потоки будут работать с ресурсом, перезаписывать нам этот ресурс не в такой то последовательности или не так как нам надо, вот я о чём. старался более конструктивно все обьяснить, надеюсь вы этот момент учтете)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории