我瞭解變量上揮發性和靜態關鍵字之間的區別。揮發性關鍵字無靜態按預期工作
靜態變量可以被不同的實例改變,而易失性變量可以被不同的線程改變。
但是,下面的程序(複製從互聯網和很少修改)掛起,如果我刪除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'的含義。 –