public class JMMDemo {
// 不加volatile就会一直执行
private volatile static int num =0;
/**
* 1、保证可见性
*/
public static void main(String[] args) {
new Thread(()->{
while (num==0){
}
}).start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
num=1;
System.out.println(num);
}
}
public class JMMDemo2 {
// AtomicInteger 变为 int 不一定 num==2w
private volatile static AtomicInteger num =new AtomicInteger();
/**
* 不保证原子性
*/
public static void add(){
num.getAndIncrement();
}
public static void main(String[] args) {
// 理论上为2W
for (int i = 1; i <= 20; i++) {
new Thread(()->{
for (int i1 = 0; i1 < 1000; i1++) {
add();
}
}).start();
}
while (Thread.activeCount()>2){
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+"---"+num);
}
}
// 指令重排
/**
* 内屏屏障,cpu指令,作用
* 1、保证特定的操作的执行顺序
* 2、可以保证某些变量的内存可见性
*/