Secara umum, terdapat contoh c dalam kuliah 17
volatile
, ia mengatakan bahawa jika pembolehubah isCancel
tidak digunakan volatile
, maka dengan menukar nilai pembolehubah ini dari benang lain, selebihnya tidak akan mengetahuinya, saya menulis semula contoh, hanya dalam kaedah run
nama benang dan nilai dipaparkan isCancel
dan ternyata tidak kira bergantung pada sama ada pembolehubah itu ada volatile
atau tidak, nilai masih berubah untuk semua aliran, walaupun anda mengetuk, saya keliru sepenuhnya; jika saya mengetahui penyegerakan, maka saya volatile
keliru dan tidak boleh menggunakannya dalam apa jua cara. Mungkin saya mencipta contoh yang salah entah bagaimana? Saya juga cuba mencipta kelas Clock
dan mewarisi daripada Thread
, dan main
mencipta dua kejadian dan menjalankan kedua-duanya, ia juga volatile
tidak berjaya, bantu saya, jika tidak, saya akan menjadi gila)
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