单例设计模式

优惠券管理 (请设计一个优惠券兑换码生成方案,可以支持20亿以上的唯一兑换码,兑换码长度不超过10,只能包含字母数字,并且要保证生成和校验算法的高效)最后把签名值的后14位、新鲜值(4位)、自增序列(32位)拼接,得到一个50位二进制数,然后与一个较大的质数做异或运算加以混淆,再基于Base32或Base64转码,即可的对兑换码。现在,就剩下防止爆刷了。自增id从1增加到Integer的最大值,可以达到40亿以上个数字,而占用的字节仅仅4个字节,也就是32个bit位,距离50个bit位的限制还有很大的剩余,符合要求! 阅读详情

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。

单例设计模式有八种方式:

1.饿汉式(静态常量)

  • 优点:简单,类装载的时候就完成了实例化,避免了线程同步问题
  • 缺点:因为类装载的时候就完成了实例化,没有lazy loading;如果没有用过这个实例,就会造成内存浪费
  • 总结:可用,可能造成内存浪费
//饿汉式(静态变量
class Singleton{

    //1. 构造器私有化,外部可以new
    private Singleton(){
    }

    //2.本类内部创建对象实例
    private final static Singleton instance = new Singleton();

    //3.对外提供一个共有的静态对象,返回实例对象
    public static Singleton getInstance(){
        return instance;
    }
}

2.饿汉式(静态代码块)

  • 跟静态变量优缺点一样!
  • 优点:简单,类装载的时候就完成了实例化,避免了线程同步问题
  • 缺点:因为类装载的时候就完成了实例化,没有lazy loading;如果没有用过这个实例,就会造成内存浪费
  • 总结:可用,可能造成内存浪费
//饿汉式(静态代码块)
class Singleton{

    //1. 构造器私有化,外部可以new
    private Singleton(){
    }

    //2.本类内部创建对象实例
    private static Singleton instance;

    static { //静态代码块中,创建单例对象
        instance = new Singleton();
    }

    //3.对外提供一个共有的静态对象,返回实例对象
    public static Singleton getInstance(){
        return instance;
    }
}

3.懒汉式(线程不安全)

  • 优点:起到了lazy loading的效果
  • 缺点:只能在单线程下使用:在if语句那,有可能会产生多个实例
  • 结论:实际开发中,不要使用这个方式
//懒汉式(线程不安全
class Singleton{
    private static Singleton instance;

    private Singleton(){}

    //提供一个静态的共有方法,当使用到该方法时,才去创建instance,即懒汉式
    public static Singleton getInstance(){
        if(null == instance){
            instance = new Singleton();
        }
        return instance;
    }

}

4.懒汉式(线程安全,同步方法)

  • 优点:起到了lazy loading的效果;解决了线程安全问题
  • 缺点:效率太低了
  • 结论:实际开发中,不推荐使用这个方式
//懒汉式(线程安全,同步方法
class Singleton{
    private static Singleton instance;

    private Singleton(){}

    //提供一个静态的公有方法,加入同步处理的代码,解决线程安全问题
    public static synchronized Singleton getInstance(){
        if(null == instance){
            instance = new Singleton();
        }
        return instance;
    }

}

5.懒汉式(线程安全,同步代码块)

在这里插入图片描述

  • 这种方式,本意是想对第四种实现方式的改进,因为前面同步方法效率太低,改为同步产生实例化的的代码块。
  • 但是这种同步并不能起到线程同步的作用。跟第3种实现方式遇到的情形一致,假如一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。
  • 结论:在实际开发中,不能使用这种方式。

6.双重检查

  • 进行了两次if的判断,保证了线程安全
  • 实例化代码只执行了一次,后面再次访问,判断if直接return实例化对象
  • 线程安全;延迟加载;效率较高
  • 结论:在实际开发中,推荐使用这种单例设计模式
//懒汉式(线程安全,双重检查方法
class Singleton{
    private static volatile Singleton instance;

    private Singleton(){}

    //提供一个静态的公有方法,加入双重检查的代码,解决线程安全问题,同时解决懒加载问题
    //同时保证了效率,推荐使用
    public static synchronized Singleton getInstance(){
        if(null == instance){
            synchronized (Singleton.class){
                if(null == instance){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

7.静态内部类

  • 采用类装载的机制来保证初始化实例时只有一个线程
  • 静态内部类方式在Singleton类被装载时不会立即实例化,而是在调用getInstance才会装载SingletonInstance
  • 优点:避免了线程不安全;利用静态内部类特点实现延迟加载,效率高
  • 推荐使用
//静态内部类完成,推荐使用的
class Singleton{
    private static volatile Singleton instance;

    //构造器私有化
    private Singleton(){}

    //写一个静态内部类,该类中有一个静态属性Singleton
    private static class SingletonInstance{
        private static final Singleton INSTANCE = new Singleton();
    }

    //提供一个静态的公有方法,直接返回SingletonInstance.INSTANCE
    public static synchronized Singleton getInstance(){
        return SingletonInstance.INSTANCE;
    }
}

8.枚举

  • 枚举:避免多线程同步问题,还能防止反序列化重新创建新的对象
  • 推荐使用
//使用枚举可以使用单例,推荐使用
enum Singleton{
    INSTANCE; //属性
    public void sayOK(){
        System.out.println("ok~~");
    }
}

单例模式注意事项和细节说明:

  • 保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
  • 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new。
  • 使用的场景:需要频繁的进行创建和销毁的对象;创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)。
在 SAP S/4HANA Public Cloud 中,用 RAP 一键生成 PDF 并在 Fiori 前端触发下载的完整方案 create;update;delete;// 生成并返回当前文档上下文。 阅读详情

相关推荐

PostgreSQL数据库全攻略:从入门到精通

本文是一份PostgreSQL数据库综合指南,涵盖安装配置、基础操作和高级管理。主要内容包括:1) PostgreSQL简介与各平台安装方法;2) 数据库基本操作,如创建数据库/表、CRUD操作、用户权限管理;3) 高级功能包括索引优化、事务控制、视图、存储过程、触发器和扩展模块;4) 数据库管理维护,涉及配置调优、备份恢复、性能监控和日常维护;5) 安全设置与高可用方案。指南提供了从入门到进阶的实用知识,强调结合官方文档进行深入学习,帮助用户高效使用这一功能强大的开源关系型数据库系统。

索大神的博客 1970

Java 单例设计模式

Java单例设计模式 一、什么是单例设计模式 单例设计模式,就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 二、如何应用单例设计模式 根据定义,一个类只能存在一种对象实例,所以我们需将类的构造访问权限设置成private,只能在类内进行操作。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象, 静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。 三、单例设计

枯寂家博客 1408

固态变压器SST 1.1 课程整体框架与学习路径

本课程围绕固态变压器(SST)全生命周期工程化流程设计,构建"规范要求-理论基础-设计方法-仿真验证-工程落地"的闭环学习体系,完整覆盖GB/T 40429-2021标准要求。课程分为基础认知、核心设计、合规验证、工程落地和前沿拓展五大模块,采用理论讲解与工程实践深度融合的教学路径,通过规范条款拆解、仿真预验证、硬件实现、试验检测等环节,培养学员从设计到落地的完整能力。课程强调标准合规性,每个设计环节均有明确规范约束,并提供标准化工程模板,确保学习成果可直接应用于实际项目开发。

技术工作者 997

单例设计模式的个人理解

1:模式:解决一类问题的固定步骤. 需求 :保证一个类中在内存中只有一个对象 (hadoop分布式文件存储系统技术.) 饿汉单例设计模式: 1.私有化本类的构造函数 2,声明本类的引用类型变量.使用 private static 来修饰.并创建本类的对象. 3.提供一个公共的方法来获取本类的对象. 代码: class Single{ private static Single

javaStudent的博客 435

从零到英雄:Spring Boot 微服务架构全攻略

在数字化转型的时代,微服务架构已成为构建可扩展、高可用系统的首选方案。本文以“从零到英雄”为主题,详细指导读者使用Spring Boot快速构建微服务帝国。从基础环境搭建入手,逐步深入到服务发现、配置管理、负载均衡、断路器、API网关、安全认证、监控与部署等核心模块。通过大量代码示例和详细解释,包括中文注释,帮助初学者和中级开发者掌握Spring Boot的核心概念和技术实践。文章强调实际操作,涵盖RESTful API开发、数据库集成、容器化部署等内容,并讨论常见问题与优化策略。无论你是Java开发者还是

一个被知识诅咒的人 2701

构建高可用CephFS NFS网关:NFS-Ganesha与RADOS集群的深度整合

本文详细介绍了如何构建高可用的CephFS NFS网关,通过NFS-Ganesha与RADOS集群的深度整合,实现高效文件共享。文章涵盖核心架构、部署实战、性能调优及避坑指南,帮助用户解决Ceph客户端兼容性问题,提升存储访问效率。特别强调高可用设计,确保服务稳定性,适用于金融、电商等高要求场景。

weixin_26976635的博客 254

八种单例设计模式

1.什么是单例设计模式? 单例设计模式就是在整个系统中或者程序中只有一个该对象的应用实例。例如: 2.单例设计模式分类 1.饿汉式 <1>静态常量 --》步骤: 1.声明静态私有的引用类型变量并用final修饰:private static final Single INSTANCE=new Single(); 2.将构造函数私有化,防止new对象 ...

qq_39246966的博客 334

AMBA-CHI协议详解(十五)

Write transactions事务描述以及请求属性,cache line状态转换。

Crazzy_M的博客 651

java单例设计模式

单例设计模式 作用:保证一个类在内存中只有一个对象。 模式:模式就是解决一类问题的固定步骤。 饿汉单例设计模式的步骤 私有化构造函数; 声明本类的引用类型变量,并且使用该变量指向本类对象; 提供一个公共静态的方法获取本类的对象; /** * 饿汉单例设计模式 */ class Single { // (2)声明本类的引用类型变量,并且使用该变量指向本类对象 private static S...

shui_zhong_yue的博客 186

2026年运维工程师常见面试选择题

这篇文章总结了30道Linux运维面试常见问题及解析,涵盖基础命令、系统监控、故障排查、数据库、缓存、容器编排等多个方面。主要内容包括: 基础命令使用:如df查看磁盘、free查看内存、top监控进程等 系统监控与故障排查:负载判断、端口检查、进程管理等 中间件相关:Nginx状态码、MySQL主从复制、Redis缓存问题 容器技术:Docker优势、Kubernetes作用 运维理念:高可用、监控告警、发布策略、备份容灾 工作原则:故障处理优先级、运维工程师核心能力 文章不仅提供标准答案,还解析了各命令的

不务正业的猿 194

建行报专版报道建设银行金融科技发展历程

经过十多年的建设,总行前中后台部门都有了自己的业务系统,但系统“部门”特征显著,渠道、客户、产品的横向整合不足,产品系统层次化、结构化、参数化程度不高,渠道支持产品快速部署以及跨渠道服务能力不足,管理分析类系统建设相对滞后,系统较弱的可扩展能力在应对高速增长的交易量时已疲态尽显,同时安全稳定运行的压力和风险日益积聚。站在新的历史起点上,科技条线将聚焦主责主业,完善信息科技管理体系,紧紧围绕安全生产中心任务,持续推动技术能力复用共享和自主可控,为全行做好金融五篇大文章,推动业务高质量发展提供技术支撑。

银行信息系统应用架构详解 386

Java中单例设计模式详解

在Java编程中,单例设计模式是一种创建对象的设计模式,它保证一个类仅有一个实例,并提供一个全局访问点来访问这个唯一实例。单例模式在很多场景下都非常有用,比如配置文件读取、线程池管理、缓存管理等。下面,我们将详细讲解Java中的单例设计模式,并通过代码示例帮助初学者理解。

qq_36720723的博客 781

超越防抖:索尼CXD5254GG芯片如何重新定义电子影像稳定

索尼CXD5254GG芯片通过融合6轴IMU与图像传感器数据,重新定义了电子影像稳定技术。其核心突破在于实时地平线校正、抑制果冻效应和镜头畸变校正,并搭载智能画质控制器提升画面细节。该芯片适用于广播制作、体育娱乐、安防监控和机器人视觉导航等专业领域,提供开箱即用的优化参数配置,大幅缩短开发周期。CXD5254GG不仅实现稳定成像,更通过姿态感知与智能优化,为专业影像应用提供了完整的稳定解决方案。

致力于lidar应用开发 114

单例设计模式总结

1为什么要用单例设计模式 2几种单例设计模式2.1懒汉式2.1.1双重校验锁并不能保证安全 2.1.2,使用volelite关键词 2.1.3,ThreadLocal修复双重检测 2.2最安全的单例-饿汉式 3枚举单例 1为什么要用单例设计模式        在我们开发过程中有时候对于某个类的实例只能有一个,也就是说该类只能被创建一次,别人想用只能用这个实例。这个在我们数据库的操作就是单例的一个体

江南的博客 468

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java的单例设计模式

java的单例设计模式单例设计模式饿汉式设计模式懒汉式设计模式理解main方法的语法 文章内容选自尚硅谷,jdk8,eclipse环境。 单例设计模式 单例设计模式就是java的某一类只能产生一个对象,要想实现只有一个对象,那就得把类的构造器声明为private,这样就无法从外部new多个对象了。 既然不能从外部new对象,但是可以从内部类内的方法中创建对象,为了保证创建的对象只有一个,把创建对象的方法声明为静态的,目的是为了从类名调用方法。静态的方法返回一个对象,因为静态方法只能调用静态的方法和属性,同时

Meloneating的博客 724

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

单例设计模式知识概括

单例设计模式知识概括单例设计模式介绍单例设计模式八种方式饿汉式(静态常量)饿汉式(静态代码块)懒汉式(线程不安全)懒汉式(线程安全, 同步方法)懒汉式(线程安全, 同步代码块)懒汉式(双重检查)懒汉式(静态内部类)饿汉式(枚举)Rumtime 单例模式单例模式注意事项 单例设计模式介绍 所谓类的单例设计模式, 就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。 比如 Hibernate 的 SessionFactory, 它充当数据

weixin_41005188的博客 434

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: UML类图
下一篇: 浅拷贝 深拷贝
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值