Я понял общее, что означает volatile
в Java. Но чтение
Спецификация Java SE 8.3.1.4 У меня есть проблема с пониманием текста под этим нестабильным примером.
class Test {
static volatile int i = 0, j = 0;
static void one() { i++; j++; }
static void two() {
System.out.println("i=" + i + " j=" + j);
}
}
Это позволяет использовать метод один и два метода одновременно, но гарантирует, что доступ к общим значениям для я и j происходит точно столько же раз и в точно таком же порядке, как они появляются для выполнения во время выполнения текста программы каждым потоком. Поэтому общее значение для j никогда не больше, чем для i, потому что каждое обновление я должно быть отражено в общем значении для я до появления обновления до j. Возможно, однако, что любой данный вызов метода 2 может наблюдать значение j, которое много больше, чем значение, наблюдаемое для i, поскольку метод может быть выполняется много раз между моментом, когда метод два выбирает значение я и момент, когда метод два выбирает значение j.
Как
j никогда не больше i
но в то же время
любое заданное вызов метода два может наблюдать значение для j, которое намного больше, чем величина, наблюдаемая при i
??
Похоже на противоречие.
Я получил j
больше, чем i
после запуска программы-примера. Зачем использовать volatile
? Он дает почти такой же результат без volatile
(также i
может быть больше, чем j
, один из предыдущих примеров в спецификациях). Почему этот пример здесь является альтернативой synchronized
?