Ümumiyyətlə, 17-ci mühazirədə c misalı var
volatile
, deyir ki, əgər dəyişən isCancel
istifadə edilmirsə volatile
, bu dəyişənin qiymətlərini başqa bir mövzudan dəyişdirməklə, digərləri bu barədə bilməyəcəklər, nümunəni yenidən yazdım, yalnız metodda run
ipin adı və dəyəri göstərilir isCancel
və məlum oldu ki, dəyişənin mövcud olub volatile
-olmamasından asılı olmayaraq, bütün axınlar üçün dəyər yenə də dəyişir, hətta döysəniz belə, tamamilə çaşmışam; əgər mən sinxronizasiyanı başa düşdüm, sonra volatile
çaşqın oldum və heç bir şəkildə tətbiq edə bilmirəm. Bəlkə nümunəni nədənsə səhv yaratmışam? Mən də bir sinif yaratmağa Clock
və -dən miras almağa Thread
, main
iki nümunə yaratmağa və hər ikisini işə salmağa çalışdım, bu da volatile
işləmədi, mənə kömək edin, əks halda dəli olacağam)
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