• 设计模式之单例模式


    转载:https://www.cnblogs.com/xudong-bupt/p/3433643.html

    单例模式就是说系统中对于某类的只能有一个对象,不可能出来第二个

    主要考察的是多线程下面单例模式的线程安全性问题

    1.多线程安全单例模式实例一(不使用同步锁)

    /**
     *<p> Description: 多线程安全单例模式实例一(不使用同步锁-饿汉模式) </p>
     *<p> Copyright: Copyright(c) 2019/5/24 </p>
     *
     *@Version 1.0 2019/5/24 17:10
     */
    public class SingletonOne {
    
        /**
         * 直接初始化一个实例对象,放在静态域
         */
        private static SingletonOne singletonOne = new SingletonOne();
    
        /**
         * private修饰的构造方法,保证不能直接new一个对象实例
         */
        private SingletonOne(){}
    
        /**
         * 单例模式类中唯一的公共的方法获取实例对象
         * (提供方法为了获取对象的引用而不是new一个新的对象)
         * @return SingletonOne
         */
        public static SingletonOne getSingletonOne() {
            return singletonOne;
        }
    }

    上述代码中的一个缺点是该类加载的时候就会直接new 一个静态对象出来,当系统中这样的类较多时,会使得启动速度变慢 。现在流行的设计都是讲“延迟加载”,我们可以在第一次使用的时候才初始化第一个该类对象。所以这种适合在小系统。

    2.多线程安全单例模式实例二(使用同步方法)

    /**
     *<p> Description: 多线程安全单例模式实例二(使用同步方法) </p>
     *<p> Copyright: Copyright(c) 2019/5/24 </p>
     *
     *@Version 1.0 2019/5/24 17:18
     */
    public class SingletonTwo {
    
        /**
         * 使用时再加载(延迟加载)
         */
        private static SingletonTwo singletonTwo;
    
        /**
         * 受保护的构造方法,防止在其他地方被实例化
         */
        private SingletonTwo() {}
    
        /**
         * 锁住了一个方法,相比SingletonOne改进就是只锁住其中的new语句就OK,即所谓的“双重锁”机制
         * @return SingletonTwo
         */
        public synchronized SingletonTwo getSingletonTwo()
        {
            if (singletonTwo == null)
            {
                return new SingletonTwo();
            }
            return singletonTwo;
        }
    }

    3.多线程安全单例模式实例三(使用双重同步锁)

    /**
     *<p> Description: 多线程安全单例模式实例三 </p>
     *<p> Copyright: Copyright(c) 2019/5/24 </p>
     *
     *@Version 1.0 2019/5/24 17:34
     */
    public class SingletonThree {
    
        /**
         * 采用延迟加载,在用到的时候才会对其进行实例化
         */
        private static SingletonThree singletonThree;
    
        /**
         * 受保护的构造方法,防止在其他地方被实例化
         */
        private SingletonThree() {}
    
        /**
         * 使用双重同步锁,对获取实例的方法进行同步
         * @return SingletonTwo
         */
        public static SingletonThree getSingletonThree()
        {
            if (singletonThree == null)
            {
                // 静态的方法,使用当前类为锁不能使用this(实例化后当前类对象)
                synchronized (SingletonThree.class)
                {
                    if (singletonThree == null)
                    {
                        singletonThree = new SingletonThree();
                    }
                }
            }
            return singletonThree;
        }
    }
  • 相关阅读:
    C++ 类型别名typedef和using
    网页布局及响应式
    js上传图片预览
    bootstrap中-webkit-text-size-adjust :not()
    开始
    通过setDB2Client*来方便的使用TRACE调优jdbc程序
    关于携程的信息泄漏
    如何设置DB2I(SPUFI)来正常工作
    Limit the query running time with Resource limit facility (RLF)
    z/os上的tar和gzip(3)
  • 原文地址:https://www.cnblogs.com/jason2018524/p/10919563.html
Copyright © 2020-2023  润新知