单例模式的几种实现方式

本文详细介绍了单例模式的定义、多种实现方式,包括静态内部类、枚举类、饿汉模式和懒汉模式,并探讨了延迟加载和单例模式在实际应用中的场景,如任务管理器、回收站、日志应用等。同时,文中还讨论了单例模式在并发环境下的线程安全问题以及Java中的优化策略。
摘要由CSDN通过智能技术生成

Table of Contents

单例模式定义

单例模式的几种实现方式

静态内部类

枚举类实现方式

饿汉模式

懒汉模式

关于延迟加载

单例模式的实际应用


单例模式定义

单例模式是设计模式当中比较常见的一个软件设计模式。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类在整个系统当中只有一个对象实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。

单例模式的几种实现方式

单例模式要保证系统中只有一个实例,在单线程情况下实现比较轻松,但是考虑并发情况的话,则实现的时候就需要做特殊处理。

推荐的方式如下:

静态内部类


public class SingletonInnerStaticClass {
    //线程安全,静态内部类
    private SingletonInnerStaticClass(){

    }

    /*
    通过静态内部类来实现
    只要应用中不使用内部类,JVM就不会去加载这个单例类,也就不会创建单例对象,
    从而实现懒汉式的延迟加载。也就是说这种方式可以同时保证延迟加载和线程安全。
    只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance
    */

    private static class SingletonHolder{
        public static SingletonInnerStaticClass instance = new SingletonInnerStaticClass();
    }

    public static SingletonInnerStaticClass newInstance(){
        return SingletonHolder.instance;
    }
}

私有构造方法,且只有当程序中去调这个内部类时,JVM才会去加载这个单例对象,也保证了延迟加载。但是在遇到序列化对象时,默认的方式运行得到的结果是多例的。

问题:为什么这种方式是线程安全的?

//todo

枚举类实现方式

class Singleton {

}
//枚举类(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用
//只要 EnumSingleton.INSTANCE.getInstance() 即可获得所要实例
enum EnumSingleton {
    //有问题
    INSTANCE;

    private Si
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值