En général, il y a un exemple c dans la leçon 17
volatile
, il dit que si une variable isCancel
n'est pas utilisée volatile
, alors en changeant les valeurs de cette variable depuis un autre thread, les autres ne le sauront pas, j'ai réécrit l'exemple, seulement dans la méthode, run
le nom du thread et la valeur sont affichés isCancel
et il s'est avéré que peu importe selon que la variable est présente volatile
ou non, la valeur change toujours pour tous les flux, même si vous frappez, je suis complètement confus ; si je j'ai compris la synchronisation, alors je suis volatile
confus et je ne peux en aucun cas l'appliquer. Peut-être que j'ai mal créé l'exemple d'une manière ou d'une autre ? J'ai aussi essayé de créer une classe Clock
et d'hériter de Thread
, main
de créer deux instances et d'exécuter les deux, cela volatile
n'a pas fonctionné non plus, aidez-moi, sinon je vais devenir fou)
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