DCL_单例模式

Posted grow001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DCL_单例模式相关的知识,希望对你有一定的参考价值。

简介

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

为什么使用单例模式:

多个线程操作不同实例对象。多个线程要操作同一对象,要保证对象的唯一性

优点:

1、在内存里只有一个实例,减少了内存的开销

2、避免对资源的多重占用

单例模式的分类

在对比每个模式通常往一下三个方面:线程的安全性、性能、懒加载(lazy )

  • 1.饿汉式:
public class HungerySingleton {
    //加载的时候就产生的实例对象
    private static HungerySingleton instance=new HungerySingleton();
    private HungerySingleton(){
    }

    //返回实例对象
   public static HungerySingleton getInstance(){
        return instance;
   }

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                System.out.println(HungerySingleton.getInstance());
            }).start();
        }
    }
}

线程安全性:在加载的时候已经被实例化,所以只有这一次,线程安全的

懒加载:没有延迟加载,好长时间不使用,影响性能

性能:性能比较好

  • 2.懒汉式
public class HoonSingleton {
    private static HoonSingleton instance=null;
    private HoonSingleton(){
    }
    public static HoonSingleton getInstance(){
        if(null==instance)
            instance=new HoonSingleton();
        return instance;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                System.out.println(HoonSingleton.getInstance());
            }).start();
        }
    }
}

线程安全:不能保证实例对象的唯一性,非线程安全

技术图片

懒加载:引发了一个不安全的问题,对于单例模式的应用有风险,而且风险比较大,,实现了懒加载

性能:相对于饿汉式还是比较好的

  • 3.懒汉式+同步方法

线程安全:是线程安全

懒加载:是懒加载

性能:+synchronized  退化到了串行执行

  • 4.Double-Check-Locking

 

public class DCL {
    private static DCL instance=null;
    private DCL(){
    }
    public  static DCL getInstance(){
        if(null==instance)
            synchronized (DCL.class){
               if(null==instance)
                    instance=new DCL();
            }
        return instance;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                System.out.println(DCL.getInstance());
            }).start();
        }
    }
}

性能比较好

懒加载:实现了懒加载

线程的安全性:保证了线程的安全

 

  • 5.Volatile+Double-check

只需要加一段代码:

 

private volatile static DCL instance=null;

 

可以避免空指针异常

 

  • 6.Holder

声明类的时候,成员变量中不声明实例变量,而放到内部静态类中

 

public class HolderDemo {
    private HolderDemo(){

    }
    private static class Holder{
        private static HolderDemo instance=new HolderDemo();
    }
    //懒加载
    //synchronized
    //<init>
    public static HolderDemo getInstance(){
        return Holder.instance;
    }

    //广泛的一种单例模式
}

 

  

 

  • 7.枚举

 

public class EnumSingletonDemo {
    private EnumSingletonDemo(){
    }
    //延迟加载
    private enum EnumHolder{
        INSTANCE;
        private static  EnumSingletonDemo instance=null;

        private EnumSingletonDemo getInstance(){
            instance=new EnumSingletonDemo();
            return instance;
        }
    }//懒加载
    public static EnumSingletonDemo  getInstance(){
        return EnumHolder.INSTANCE.instance;
    }

}

 

  

 

以上是关于DCL_单例模式的主要内容,如果未能解决你的问题,请参考以下文章

DCL并非单例模式专用

DCL 单例模式是否需要volatile?

DCL单例模式你不知道的秘密

DCL单例模式浅析

Java枚举单例模式比DCL和静态单例要好?

单例模式双重检查(DCL)引发的多线程问题