変数のvolatileキーワードとstaticキーワードの違いを理解しました。静的な揮発性キーワードが期待どおりに機能しない
静的変数は異なるインスタンスによって変更できますが、揮発性変数は異なるスレッドによって変更できます。
しかし、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-youever-use-the-volatile-keyword-in-java) – xenteros
@ xenterosいいえ、これは 'static'の意味を尋ねる質問の複製です。 –