Em geral, tem um exemplo c na aula 17
volatile
, diz que se uma variável isCancel
não for usada volatile
, então alterando os valores dessa variável de outro thread, o resto não saberá, reescrevi o exemplo, apenas no método run
o nome do thread e o valor são exibidos isCancel
e descobriu-se que independente da variável estar presente volatile
ou não, o valor ainda muda para todos os fluxos, mesmo se você bater, fico completamente confuso; se eu descobri a sincronização, então estou volatile
confuso e não consigo aplicá-la de forma alguma. Talvez eu tenha criado o exemplo errado de alguma forma? Também tentei criar uma classe Clock
e herdar de Thread
, e main
criar duas instâncias e rodar as duas, também volatile
não funcionou, me ajudem, senão vou enlouquecer)
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