Ich verstand den Unterschied zwischen flüchtigen und statischen Keywords auf Variablen.Volatile Schlüsselwort ohne statische funktioniert nicht wie erwartet
statische Variablen können durch verschiedene Instanzen geändert werden, während flüchtige Variablen durch verschiedene Threads geändert werden können.
Aber das folgende Programm (kopiert aus dem Internet und wenig geändert) hängt, wenn ich das statische Schlüsselwort für MY_INT Variable entfernen.
Das Update auf Variable MY_INT sollte von anderen Threads auch ohne statisches Schlüsselwort gesehen werden. Aber wenn ich statische entfernen, hängt es.
Bitte helfen Sie mir, dieses Problem zu verstehen.
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();
}
}
}
}
}
}
Mögliche Duplikate von [Verwenden Sie jemals das flüchtige Schlüsselwort in Java?] (Http://stackoverflow.com/questions/106591/do-you-ever-use-the-volatile-keyword-in-java) – xenteros
@xenteros Nein, dies ist ein Duplikat einer Frage, die nach der Bedeutung von 'statisch' fragt. –