Умуман, дар лексияи 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();
}
}
}
}
GO TO FULL VERSION