Im Allgemeinen gibt es in Vorlesung 17 ein Beispiel c.
volatile
Darin heißt es: Wenn eine Variable isCancel
nicht verwendet wird volatile
und die Werte dieser Variablen in einem anderen Thread geändert werden, erfahren die anderen nichts davon. Ich habe das Beispiel nur umgeschrieben In der Methode run
werden der Name des Threads und der Wert angezeigt isCancel
und es stellte sich heraus, dass sich unabhängig davon, ob die Variable vorhanden ist volatile
oder nicht, der Wert immer noch für alle Flüsse ändert, selbst wenn man klopft, bin ich völlig verwirrt; wenn ich Wenn ich die Synchronisierung herausgefunden habe, bin ich volatile
verwirrt und kann sie in keiner Weise anwenden. Vielleicht habe ich das Beispiel irgendwie falsch erstellt? Ich habe auch versucht, eine Klasse zu erstellen Clock
und von zu erben Thread
, und main
zwei Instanzen zu erstellen und beide auszuführen, es volatile
hat auch nicht funktioniert, hilf mir, sonst werde ich verrückt)
public static void main(String[] args)
{
Clock n = new Clock();
Thread thread1 = new Thread(n);
Thread thread2 = new Thread(n);
thread1.start();
thread2.start();
try
{
Thread.sleep(3000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
n.cancel();
}
public static class Clock implements Runnable
{
private volatile boolean isCancel = false;
public void cancel()
{
this.isCancel = true;
}
@Override
public void run()
{
while (true)
{
try
{ System.out.println(Thread.currentThread().getName()+" "+isCancel);
Thread.sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
GO TO FULL VERSION