• 并发-可见性


    变量的可见性分析

    关键字:可见性案例验证、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);
            }
        }
    
    
    }
     
    

      

  • 相关阅读:
    一个自动打补丁的脱机程序
    OPC 学习交流感想
    串口标准,说说流控制(RTS/CTS/DTR/DSR 你都明白了吗?)
    asp.net中调用COM组件发布IIS时常见错误 80070005解决方案
    可运行XP的最少后台服务配置
    MapGIS 7.0 SP2 企业版 & MapGIS 7.1IMS
    简单认识一下S60系统
    常用正则表达式
    图像处理:遮罩
    office2003中WORD中visio图无法打印中文问题解决方法
  • 原文地址:https://www.cnblogs.com/qq610039525/p/12668014.html
Copyright © 2020-2023  润新知