一般来说,第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