Generalnie na wykładzie 17 jest przykład c
volatile
, który mówi, że jeśli zmienna isCancel
nie zostanie użyta volatile
, to zmieniając wartości tej zmiennej z innego wątku, reszta się o tym nie dowie, przepisałem przykład, tylko w metodzie run
wyświetla się nazwa wątku i wartość isCancel
i okazało się, że niezależnie od tego, czy zmienna jest obecna, volatile
czy nie, wartość i tak zmienia się dla wszystkich przepływów, nawet jeśli zapukasz, jestem całkowicie zdezorientowany; jeśli wymyśliłem synchronizację, wtedy jestem volatile
zdezorientowany i nie mogę jej zastosować w żaden sposób. Może w jakiś sposób źle stworzyłem przykład? Próbowałem też utworzyć klasę Clock
i dziedziczyć z Thread
, main
utworzyć dwie instancje i uruchomić obie, to też volatile
nie zadziałało, pomóż mi, inaczej zwariuję)
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