单例模式


单例模式属于创建型类型,单例模式强调的是只有单个对象被创建。

1、分类

  单例模式分为两类:懒汉模式饿汉模式;如果说这两者的区别可以简单概括为 “按需所得”;就内存方面,需要时加载避免了内存的消耗。(作者认为两者使用还得视实际情况而定)

2、安全

  只要实际要使用的软件都逃不掉安全;单例模式也不例外,只要在多线程的环境下,我们就得考虑线程安全问题;常见解决线程安全的措施:加锁、枚举、无状态类等

3、用例

  • 3.1、 饿汉模式之线程安全的

示例1:

public class singleton{
    private static final singleton instance=new singleton();
    //私有的构造函数
    private singleton(){
        
    }
    //静态方法得到实例
    public static singleton getInstance(){
        return instance;
    }
}

示例2:

public class singleton{
    private static final singleton instance;
    //私有的构造函数
    private singleton(){
        
    }
    //静态块
    static{
        instance=new singleton();
    }
    //静态方法得到实例
    public static singleton getInstance(){
        return instance;
    }
}
为什么这两个示例线程安全,这主要是由jvm决定。
  • 懒汉模式

示例1之线程非安全的

public class singleton{
    private static  singleton instance;
    //私有的构造函数
    private singleton(){
        
    }
    //静态方法得到实例
    public static singleton getInstance(){
        if(instance==null){
            instance=new singleton();
        }
        return instance;
    }

示例2之线程安全

public class singleton{
    private static  singleton instance;
    //私有的构造函数
    private singleton(){
        
    }
    //静态方法得到实例
    public synchronized static singleton getInstance(){
        if(instance==null){
            instance=new singleton();
        }
        return instance;
    }

public class singleton{
    private static volatile singleton instance;
    //私有的构造函数
    private singleton(){
        
    }
    //静态方法得到实例
    public  static singleton getInstance(){
        if(instance==null){
         synchronized(singleton.class){
            instance=new singleton();
            }
        }
        return instance;
    }

  • double check

public class singleton06 {
    private static  volatile  singleton06 instance ;
    private singleton06() {
    }

    public  static singleton06 getInstance() {
        if(instance==null){
            synchronized (singleton06.class) {
                if(instance==null)
                instance = new singleton06();
            }
            System.out.println("懒汉模式的线程安全");
        }
        return instance;
    }
}
  • 静态内部类

public class singleton07 {
    private singleton07() {
    }
    private static class single{
        private static final singleton07 instance =new singleton07();
    }
    public  static synchronized singleton07 getInstance() {
        return single.instance;
    }
}
  • 枚举

public enum Single {
    INSTANCE;
    public void getInstance(){
        System.out.println("s");
    }
}
public class singleton08 {
    public static void main(String[] args) {
        Single.INSTANCE.getInstance();
    }
}

以上大致就是单例模式的八种写法。具体如何使用得需要依实际情况而定。注单例模式的侧重点是线程安全。

4 问题引申

问题引申旨在让读者不要停留在其表面上,要从现象窥探本质;深刻理解其技术理论。
  • 1、JVM的类加载机制(类加载过程和类加载器)
  • 2、Java的内存模型(JMM)和多线程的线程安全。
  • 3、关于单例模式在spring中的应用。
  • 4、单例模式和原型模式的区别

5资料推荐


ThreadNew
1 声望0 粉丝

NPE让人头疼