zoukankan      html  css  js  c++  java
  • 并发-可见性

    变量的可见性分析

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

      

  • 相关阅读:
    httphelper
    MD5加密
    json操作
    将list转成tree
    GenerateId类:生成唯一id、订单号
    加密、解密(默认密钥向量)
    Hadoop HDFS批量处理
    OceanBase学习总结
    TiDB学习
    开机自启动rc.local文件修改权限
  • 原文地址:https://www.cnblogs.com/qq610039525/p/12668014.html
Copyright © 2011-2022 走看看