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_单例模式的主要内容,如果未能解决你的问题,请参考以下文章