• java并发编程(9)内存模型


    JAVA内存模型

      在多线程这一系列中,不去探究内存模型的底层

    一、什么是内存模型,为什么需要它

      在现代多核处理器中,每个处理器都有自己的缓存,定期的与主内存进行协调;

      想要确保每个处理器在任意时刻知道其他处理器正在进行的工作,将需要很大的开销;且通常是没必要的

      我们只有在需要跨线程共享数据时,才需要知道信息;而在JAVA中就是通过正确的同步来实现

      1.重排序

        如下:判断输出的值将十分困难

    public class PossibleReordering {
        static int x = 0, y = 0;
        static int a = 0, b = 0;
    
        /**
         * 判断输出值将会非常困难:
         * 1:多线程之间的切换,导致可能的输出值:(0,1)(1,0)(1,1)
         * 2.指令重排序:one线程如a=1和x=b之间重排序,x=b(0),然后other线程被调度执行y=a(0),将导致(0,0)
         */
        public static void main(String[] args) throws InterruptedException {
            Thread one = new Thread(new Runnable() {
                public void run() {
                    a = 1;
                    x = b;
                }
            });
            Thread other = new Thread(new Runnable() {
                public void run() {
                    b = 1;
                    y = a;
                }
            });
            one.start();
            other.start();
            one.join();
            other.join();
            System.out.println("( " + x + "," + y + ")");
        }
    }

       2.JAVA内存模型简介

        偏序关系:反对称、自反和传递属性;但是对于任意的两个元素A和B,并不一定满足A偏向B或B偏向A的关系

          如:A和B之间我更偏向B,但是我没必要明确的做出选择

        JMM为程序中所有的操作定义了一个偏序关系,称之为Happens-Before;要想保证执行B操作的线程看到执行A操作的线程的结果,无论AB是否在同一线程,必须满足Happens-Before关系,否则JVM就会对其重排序

        

    如:加锁操作,就可以预知执行顺序,多个线程之间就符合Happens-Before,不加锁则无法判断线程之间的调度,

      3.发布

         真正原因:发布一个共享对象  和  在另一个线程中访问该对象之间没有Happens-Before关系;由于指令重排序,导致对象没有正确构建则被发布

    public class UnsafeLazyInitialization {
        private static Resource resource;
    
        /**
         * 除了竟态条件问题检查后执行,还有不安全发布的问题
         * 如:一个线程A进来,看到resource为null,则实例化并返回;另一个线程B进来看到resource不为null直接返回
         * 如果在线程A中对resource进行了修改,则可能在线程B中看不到resource的正确状态
         */
        public static Resource getInstance() {
            if (resource == null)
                resource = new Resource(); // unsafe publication
            return resource;
        }
    
        static class Resource {
        }
    }

         

  • 相关阅读:
    平均值的最值化
    GCJ 2008 R3 C 二分图匹配
    BZOJ 1013 高斯消元
    NOIP2015 d2T3 二分+树上前缀和
    9.7集训 总结
    BZOJ 1026
    BZOJ 3223
    NOIP前夕:codevs,关路灯
    NOIP前夕:codevs,解药还是毒药
    NOIP前夕:codevs,修剪花卉
  • 原文地址:https://www.cnblogs.com/zhangxinly/p/6951838.html
Copyright © 2020-2023  润新知