1. volatile保证内存可见
- volatile保证java多线程内存(不是内存一致性,内存一致性是由内存一致性协议保证的,这里说的内存可见性是指JMM可见性.)可见是最为正规和常用的方式,下面是一个简单的实现demo:
public class Demo01 {
private static volatile boolean flag = true;
public static void main(String[] args) throws Exception {
new Thread(new Runnable() {
@Override
public void run() {
while (flag){
}
System.out.println("end...");
}
}).start();
Thread.sleep(2000);
flag = false;
}
}
上述代码中,如果把关键字volatile去掉,那么程序就会陷入死循环,无法结束。主要是因为,没有volatile关键字,子线程的内存里面的flag是线程刚开始执行时候读取的值,是true。即便后面主线程休眠结束之后,修改了flag为false,但子线程依旧是无法感知的。有了volatile关键字,变量每次变化都会通知各个线程做同步。
2. sleep同步内存数据
public class Demo02 {
private static boolean flag = true;
publ