一点一点

单例模式

设计模式分类

设计模式分为三种类型,共23种 1)

  1. 创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
  2. 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享 元模式、代理模式。
  3. 行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者 模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模 式、策略模式、职责链模式(责任链模式)。

单例模式

在整个软件系统中某个类只有一个实例化对象 即为单例模式

单例模式有八种

  1. 饿汉式

这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同 步问题。

在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始 至终从未使用过这个实例,则会造成内存的浪费

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}
  1. 懒汉式

解决了线程不安全问题

效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行 同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例, 直接return就行了。

方法进行同步效率太低

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}
  1. 双重检查

双重检查概念是多线程开发中常使用到的,如代码中所示,我们进行了两 次if (singleton == null)检查,这样就可以保证线程安全了。

这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null), 直接return实例化对象,也避免的反复进行方法同步.

线程安全;延迟加载;效率较高

class Singleton {
    private static volatile Singleton singleton;

    private Singleton() {
    }

    public static synchronized Singleton getSingleton() {
        if (Singleton.singleton == null) {
            synchronized (Singleton.class) {
                if (Singleton.singleton == null) {
                    Singleton.singleton = new Singleton();
                    return Singleton.singleton;
                }
            }

        }
        return Singleton.singleton;
    }
    
}
  1. 静态内部类

这种方式采用了类装载的机制来保证初始化实例时只有一个线程。

静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化 时,调用getInstance方法,才会装载SingletonHolder类,从而完成Singleton的 实例化。

类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们 保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。

避免了线程不安全,利用静态内部类特点实现延迟加载,效率高

public class Singleton {  
    private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
    }  
}
  1. 枚举
public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}
posted @ 2020-07-13 14:04  6风筝9  阅读(125)  评论(0编辑  收藏  举报