一般來說,第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