Жалпысынан алганда, 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