Вообщем есть в лекции 17 пример c
volatile
, там сказано, если у переменной isCancel
не использовать volatile
то изменяя значения данной переменной из другой нити остальные о нем не узнают, я переписал пример, только в методе run
происходит вывод имени потока и значения isCancel
и получилось так, что у независимо от того, будет ли стоять у переменной volatile
или не будет, значение всеравно меняется для всех поток, хоть стукните но я запутался окончательно, если с синхронизацией я разобрался, то с volatile
я запутался и не могу его никак применить. Может я как то не так пример создал? Я пробовал еще создать класс Clock
и унаследовать от Thread
, а в main
создать два экземпляра и оба запустить, так же volatile
не работал,помогите иначе я сойду сума )
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();
}
}
}
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
И важно помнить, что volatile не на 100% решает проблему. Даже если процессору запрещено хранить в кэше эту переменную, существует небольшая вероятность конфликта данных, пока процессор считывает, меняет и возвращает ее обратно. В лекциях еще будет об этом.