当前位置:   article > 正文

JAVA架构师之路三:设计模式之单例模式_oos切莫意思

oos切莫意思

JAVA架构师之路二:设计模式之工厂模式

日头没有辜负我们,我们也切莫辜负日头。——沈从文

代码世界中也存在以下顺口溜:

我单身,我骄傲,我为国家省套套。
我单身,我自豪,我为祖国省橡胶。
  • 1
  • 2

单例模式虽然简单,但真正懂的内行的人并不多,今天挑战全网最全的经典设计模式之单例模式。

1. 单例模式

定义

确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。
隐藏其构造方法
属于创建型设计模式

适用场景

确保任何情况下都绝对只有一个实例
ServletContext、ServletConfig、ApplicationContext、DBPool

2. 饿汉式单例

定义

系统初始化的时候就加载,不管有没有用到这个单例。

优点

执行效率高,性能高,没有任何的锁

缺点

某些情况下,可能会造成内存浪费
能够被反射破坏

代码

public class HungrySingleton {
   

    private static final HungrySingleton singleton = new HungrySingleton();

    private HungrySingleton(){
   }

    public static HungrySingleton getInstance() {
   
        return singleton;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3. 懒汉式单例

定义

系统初始化的时候不创建实例,只有用到的时候才创建实例。

优点

节省了内存

缺点

synchronized造成性能低下
能够被反射破坏

3.1 方法加锁写法

代码

public class LazySingleton {
   

    private static LazySingleton singleton = null;

    private LazySingleton(){
   }


    /**
     * 版本1
     * @return
     */
    public static synchronized LazySingleton getInstance() {
   
        if (null == singleton) {
   
            singleton = new LazySingleton();
        }
        return singleton;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

3.2 代码块加锁写法

代码

public class LazySingleton {
   

    private static LazySingleton singleton = null;

    private LazySingleton(){
   }
    
    /**
     * 版本2 相比版本1优化一点点
     * @return
     */
    public static LazySingleton getInstance() {
   
        synchronized (LazySingleton.class) {
   
            if (null == singleton) {
   
                singleton = new LazySingleton();
            }
        }
        return singleton;
    } 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

3.3 双重判断加锁写法

陷阱案例

public class LazySingleton {
   

    private static LazySingleton singleton = null;

    private LazySingleton(){
   }
    
    /**
     * 版本3 双重判断
     * @return
     */
    public static LazySingleton getInstance() {
   
        if (null == singleton) {
   
            synchronized (LazySingleton.class) {
   
                if (null == singleton) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/157774
推荐阅读
相关标签
  

闽ICP备14008679号