试验代码如下
public class test {
public static void main(String[] args) throws InterruptedException {
Job job = new Job();
new Thread(job).start();
Thread.sleep(1300L);
println("main: I'm tired of waiting!");
job.cancel();
println("main: Now I can quit");
}
private static void println(String s) {
System.out.println(s);
}
static class Job implements Runnable{
private volatile boolean isActive = true;
public void cancel(){
isActive = false;
}
@Override
public void run() {
long startTime = System.currentTimeMillis();
long nextPrintTime = startTime;
int i = 0;
while (isActive) {
if (System.currentTimeMillis() >= nextPrintTime) {
System.out.println("job: I'm sleeping " + i++);
nextPrintTime += 500L;
}
}
}
}
}
-
此时isActive实例变量有volatile关键字情况,打印结果如下:
> Task :test.main() job: I'm sleeping 0 job: I'm sleeping 1 job: I'm sleeping 2 main: I'm tired of waiting! main: Now I can quit
-
当把实例变量isActive关键字中volatile关键字去掉,打印出的结果是
> Task :test.main() job: I'm sleeping 0 job: I'm sleeping 1 job: I'm sleeping 2 main: I'm tired of waiting! main: Now I can quit job: I'm sleeping 3
对比可以看出,在一个线程修改另一个现场的值,如果没有volatile关键字,很容易另一个线程的中引用的值还是旧的值。验证了理论的正确性。