一般に、講義 17 に例 c があります
volatile
。変数isCancel
が使用されていないvolatile
場合、この変数の値を別のスレッドから変更することで、他のスレッドはそれを知りません。例を書き直しました。メソッドにはrun
スレッドの名前と値が表示されますisCancel
が、変数が存在するかどうかに関係なくvolatile
、ノックしてもすべてのフローで値が変化することがわかりました。同期を理解した後、volatile
混乱してしまい、それを適用することができません。もしかして私がサンプルを間違って作成したのでしょうか?また、クラスClock
を作成して から継承しThread
、main
2 つのインスタンスを作成して両方を実行しようとしましたが、これも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