Umuman olganda, 17-ma'ruzada c misoli bor
volatile
, unda aytilishicha, agar o'zgaruvchi isCancel
ishlatilmasa volatile
, bu o'zgaruvchining qiymatlarini boshqa ipdan o'zgartirib, boshqalar bu haqda bilmaydi, men misolni qayta yozdim, faqat usulda run
ipning nomi va qiymati ko'rsatiladi isCancel
va ma'lum bo'ldiki, o'zgaruvchining mavjudligi volatile
yoki yo'qligidan qat'i nazar, qiymat barcha oqimlar uchun o'zgaradi, hatto siz taqillatgan bo'lsangiz ham, men butunlay sarosimaga tushaman; agar men sinxronizatsiyani aniqladim, keyin men volatile
sarosimaga tushdim va uni hech qanday tarzda qo'llay olmayman. Ehtimol, men qandaydir tarzda misolni noto'g'ri yaratganman? Men ham sinf yaratishga Clock
va dan meros olishga Thread
va main
ikkita misol yaratishga va ikkalasini ham ishga tushirishga harakat qildim, u ham volatile
ishlamadi, menga yordam bering, aks holda aqldan ozaman)
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