转载: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; } }