Жалпы, 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