设计模式之单例模式

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

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

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

 

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

/**
 *

Description: 多线程安全单例模式实例一(不使用同步锁-饿汉模式)

*

Copyright: Copyright(c) 2019/5/24

* *@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.多线程安全单例模式实例二(使用同步方法)

/**
 *

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

*

Copyright: Copyright(c) 2019/5/24

* *@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.多线程安全单例模式实例三(使用双重同步锁)

/**
 *

Description: 多线程安全单例模式实例三

*

Copyright: Copyright(c) 2019/5/24

* *@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; } }

 

转载于:https://www.cnblogs.com/jason2018524/p/10919563.html

你可能感兴趣的:(设计模式之单例模式)