并发-可见性

变量的可见性分析

关键字:可见性案例验证、volatile、Unsafe中loadForce方法实现读屏障

可见性保证:

同步

volatile

魔术类内存屏障

 

内存屏障说明

loadForce实现volatile读(缓存数据置为无效、重新从主存加载)

storeForce实现volatile写(数据立即写入主存,通知其他CPU更新缓存)

指令重排说明

第一个变量是volatile读,禁止后一个变量读写重排序

第二个变量是volatile写,禁止和第一个变量读写重排序

第一个变量是volatile写、第二个是volatile读,两个变量不能冲排序

public class VolatileExample {

    public /*volatile*/ boolean isBreak;

    public boolean getBreak() {
        return isBreak;
    }

    public void toBreak() {
        isBreak = true;
        System.out.println("中断标志位isBreak:" + isBreak);

    }

    /**
     * 业务处理线程
     */
    public class LoopThread extends Thread {
        @Override
        public void run() {
            System.out.println("开始处理业务,当isShutdown置为false停止");
            unsafe().loadFence();
            while (!isBreak) {
                unsafe().loadFence();
            }
            ;
            System.out.println("处理业务结束");
        }
    }

    /**
     * 中断线程
     */
    public class BreakThread extends Thread {
        @Override
        public void run() {
            toBreak();

        }
    }

    public static void main(String[] args) {
        try {
            VolatileExample example = new VolatileExample();
            example.new LoopThread().start();
            Thread.sleep(1000);
            example.new BreakThread().start();

            Thread.sleep(1000);
            System.out.println("中断标志位:" + example.getBreak());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static Unsafe unsafe() {
        try {
            Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
            theUnsafe.setAccessible(true);
            return (Unsafe) theUnsafe.get(null);
        } catch (Exception e){
            throw new RuntimeException(e);
        }
    }


}
 

  

posted @ 2020-04-09 16:57  Cao_Yeung  阅读(191)  评论(0编辑  收藏  举报