zoukankan      html  css  js  c++  java
  • 【并发编程】延时初始化

    不安全的延时初始化:

    /**
     * Unsafe lazy initialization
     */
    @NotThreadSafe
    public class UnsafeLazyInitialization {
        private static Resource resource;

        //resource的赋值可能和Resource()域的赋值 顺序重排序
        public static Resource getInstance() {
            if (resource == null)
                resource = new Resource(); // unsafe publication
            return resource;
        }
        static class Resource {
        }
    }
    线程not-safe说明:


    安全的延时初始化
    /**
     * Thread-safe lazy initialization
    */
    @ThreadSafe
    public class SafeLazyInitialization {
        private static Resource resource;
        public synchronized static Resource getInstance() {
            if (resource == null)
                resource = new Resource();
            return resource;
        }
        static class Resource {
        }
    }


    安全的延时初始化
    延时初始化占位符模式--使用static初始化--不需要显示的同步
    /**
     * Lazy initialization holder class idiom
     */
    @ThreadSafe
    public class ResourceFactory {
        private static class ResourceHolder {
            //使用static静态初始化(关键)
            public static Resource resource = new Resource();
        }
        //当任何一个线程在首次调用getResource()时,都会使ResourceHolder被加载和被初始化
        public static Resource getResource() {
            return ResourceFactory.ResourceHolder.resource;
        }
    }















  • 相关阅读:
    $Noip2011/Luogu1311$ 选择客栈
    $Noip2013/Luogu1970$ 花匠 $dp$+思维
    $CF1063B Labyrinth$ $01$最短路/$01BFS$
    $UVA10559 Blocks $区间$dp$
    $SCOI2009 windy$数 数位$dp$
    $cometoj#4 D $求和 不是$dp$
    Manacher算法总结
    题解 P1537 【弹珠】
    题解 P4609 【[FJOI2016]建筑师】
    字符串专题随笔
  • 原文地址:https://www.cnblogs.com/ssslinppp/p/5510256.html
Copyright © 2011-2022 走看看