public class VolatileTest {
private static boolean flag = true; //不用volatile修饰
//private volatile static boolean flag = true; //用volatile修饰
public static void main(String[] args) throws InterruptedException {
new Thread1().start();
Thread.sleep(1000); //暂停1秒 保证线程1 启动并运行。
new Thread2().start();
}
/**
* 线程1 一个循环,如果 flag为false 跳出循环
*/
static class Thread1 extends Thread {
@Override
public void run() {
while (flag) {
}
System.out.println("thread1-run");
}
}
/**
* 线程2 2秒后将flag改成false
*/
static class Thread2 extends Thread {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread2-run");
flag = false;
System.out.println("flag 被改成false");
}
}
}
不使用volatile修饰结果:程序一直处于运行中,说明线程2 将flag更改为flag后,线程1 并不知道
使用volatile修饰结果:此时线程1 感知到flag 变成了flag;跳出循环,输出 thread1-run,说明 volatile修饰变量 在线程中的 可见性
拿数字测试一样道理
public class VolatileTest {
private volatile static boolean flag = true; //不用volatile修饰
public static void main(String[] args) throws InterruptedException {
new Thread1().start();
Thread.sleep(1000); //暂停1秒 保证线程1 启动并运行。
new Thread2().start();
}
/**
* 线程1 一个循环,如果 flag为false 跳出循环
*/
static class Thread1 extends Thread {
@Override
public void run() {
while (flag) {
}
System.out.println("thread1-run");
}
}
/**
* 线程2 2秒后将flag改成false
*/
static class Thread2 extends Thread {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread2-run");
flag = false;
System.out.println("flag 被改成false");
}
}
}