前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DCL_单例模式

DCL_单例模式

作者头像
用户4283147
发布2022-10-27 10:05:00
2810
发布2022-10-27 10:05:00
举报
文章被收录于专栏:对线JAVA面试对线JAVA面试

简介

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

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

为什么使用单例模式:

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

优点:

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

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

单例模式的分类

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

  • 1.饿汉式:
代码语言:javascript
复制
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.懒汉式
代码语言:javascript
复制
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
代码语言:javascript
复制
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

只需要加一段代码:

代码语言:javascript
复制
private volatile static DCL instance=null;

可以避免空指针异常

  • 6.Holder

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

代码语言:javascript
复制
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.枚举
代码语言:javascript
复制
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;
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 对线JAVA面试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
    • 单例模式的分类
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档