http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.3.1.4
Спецификация языка Java 8/8.3.1.4 volatile Fields
Вопрос:
В примере с volatile я добавляю ключевое слово synchronized к методу two()
, чтобы избежать выполнения one()
во время метода two()
.
Но я все же заметил, что j
больше, чем i
: почему?
Примечание.
Я использую Java HotSpot 1.8.0_112.
If you can not noticed j is larger than i, please set testVolatile()/num to a larger number.
Моя демонстрация:
public class VolatileDemo {
static volatile int i = 0, j = 0;
static void one() {
i++;
j++;
}
static synchronized void two() {
if (i != j)
System.out.println("i=" + i + " j=" + j);
}
static void testVolatile() {
int num = 5000;
for (int i = 0; i < num; i++) {
new Thread(new Runnable() {
public void run() {
one();
}
}).start();
}
for (int i = 0; i < num; i++) {
new Thread(new Runnable() {
public void run() {
two();
}
}).start();
}
}
public static void main(String[] args) {
testVolatile();
}
}
Мой результат:
i=4996 j=4998
i=4998 j=5000
i=4998 j=5000
....