我了解变量上挥发性和静态关键字之间的区别。挥发性关键字无静态按预期工作
静态变量可以被不同的实例改变,而易失性变量可以被不同的线程改变。
但是,下面的程序(复制从互联网和很少修改)挂起,如果我删除MY_INT变量的静态关键字。
即使没有静态关键字,其他线程也应该看到变量MY_INT的更新。但是,如果我删除静态它挂起。
请帮我理解这个问题。
public class PrintOddAndEven extends Thread {
static volatile int i = 1;
Object lock;
PrintOddAndEven(Object lock) {
this.lock = lock;
}
public static void main(String ar[]) {
Object obj = new Object();
PrintOddAndEven odd = new PrintOddAndEven(obj);
PrintOddAndEven even = new PrintOddAndEven(obj);
odd.setName("Odd");
even.setName("Even");
odd.start();
even.start();
}
@Override
public void run() {
while (i <= 10) {
if (i % 2 == 0 && Thread.currentThread().getName().equals("Even")) {
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + " - " + i);
i++;
lock.notify();
}
}
if (i % 2 == 1 && Thread.currentThread().getName().equals("Odd")) {
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + " - " + i);
i++;
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
可能的重复[你有没有在Java中使用volatile关键字?](http://stackoverflow.com/questions/106591/do-you-ever-use-the-volatile-keyword-in-java) – xenteros
@xenteros不,这是一个问题的重复,它询问'static'的含义。 –