volatile 三种特性

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、可以保证某些变量的内存可见性
      */

image.png

你可能感兴趣的:(volatile 三种特性)