volatile 修饰的变量具有可见性,口说无凭,我们下面就测试一下。用代码来说明
public class TestVolatile2 {
//测试一
// private static boolean isOk = true;
//测试二
private static volatile boolean isOk = true;
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
Util.sleep(1000);
isOk = false;
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
Util.println("开始循环了");
while (isOk) {
}
Util.println("跳出循环了");
}
});
thread1.start();
thread2.start();
thread1.join();
// thread2.join();
// VolatileTest.volatileTest(args);
}
}
- 测试结果:
使用 “测试一” 得出结果:
开始循环了
使用 “测试二” 得出结果:
开始循环了
跳出循环了 - 测试说明:
使用volatile后,thread2的 while (isOk) 跳出了循环
未使用 volatile,那么thread2 会一直在循环中无法跳出 - 测试结论:
使用 volatile 后,保证了改变的可见性。
测试说明 volatile 是具有可见性的