In generale, c'è un esempio c nella lezione 17
volatile
, dice che se una variabile isCancel
non viene utilizzata volatile
, quindi modificando i valori di questa variabile da un altro thread, gli altri non lo sapranno, ho riscritto l'esempio, solo nel metodo run
viene visualizzato il nome del thread e il valore isCancel
e si è scoperto che indipendentemente dalla presenza volatile
o meno della variabile, il valore cambia comunque per tutti i flussi, anche se bussi sono completamente confuso; se ho capito la sincronizzazione, quindi sono volatile
confuso e non riesco ad applicarla in alcun modo. Forse ho creato l'esempio in modo sbagliato in qualche modo? Ho anche provato a creare una classe Clock
ed ereditare da Thread
, a main
creare due istanze ed eseguirle entrambe, inoltre volatile
non ha funzionato, aiutami, altrimenti impazzisco)
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