设计模式之单例模式实践

转载自 设计模式之单例模式实践

概念

单例模式即一个JVM内存中只存在一个类的对象实例



分类

1、懒汉式

类加载的时候就创建实例

2、饿汉式

使用的时候才创建实例


当然还有其他的生成单例的方式,双重校验锁,枚举和静态内部类,文中会有介绍


实践

懒汉式

1)线程不安全,不可用

public class Singleton {  

    private static Singleton instance;  

    private Singleton (){}  

  

    public static Singleton getInstance() {  

    if (instance == null) {  

        instance = new Singleton();  

    }  

    return instance;  

    }  


2)线程安全,同步方法,效率低,不推荐

public class Singleton {  

    private static Singleton instance;  

    private Singleton (){}  

    public static synchronized Singleton getInstance() {  

    if (instance == null) {  

        instance = new Singleton();  

    }  

    return instance;  

    }  


3)线程不安全,会产生多个实例,不可用

public class Singleton {

    private static Singleton singleton;

private Singleton() {}


    public static Singleton getInstance() {

        if (singleton == null) {

            synchronized (Singleton.class) {

                singleton = new Singleton();

            }

        }

        return singleton;

    }

}


饿汉式,无线程安全问题,不能延迟加载,影响系统性能

4)

public class Singleton {  

    private static Singleton instance = new Singleton();  

    private Singleton (){}  

    public static Singleton getInstance() {  

return instance;  

    }  


5)

public class Singleton {  

    private static Singleton instance = null;  

    static {  

instance = new Singleton();  

    }  

    private Singleton (){}  

    public static Singleton getInstance() {  

return instance;  

    }  

}


6)双重校验锁,线程安全,推荐使用

public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}


    public static Singleton getInstance() {

        if (singleton == null) {

            synchronized (Singleton.class) {

                if (singleton == null) {

                    singleton = new Singleton();

                }

            }

        }

        return singleton;

    }


7)静态内部类,线程安全,主动调用时才实例化,延迟加载效率高,推荐使用

public class Singleton {  

    private static class SingletonHolder {  

private static final Singleton INSTANCE = new Singleton();  

    }  

    private Singleton (){}  

    public static final Singleton getInstance() {  

return SingletonHolder.INSTANCE;  

    }  


8)枚举类型,无线程安全问题,避免反序列华创建新的实例,很少使用

public enum Singleton {  

    INSTANCE;  

    public void whateverMethod() {  

    }  

}


注意事项

1、考虑多线程问题

2、单例类构造方法要设置为private类型禁止外界new创建

private Singleton() {}

3、如果类可序列化,考虑反序列化生成多个实例问题,解决方案如下

private Object readResolve() throws ObjectStreamException {  

// instead of the object we're on, return the class variable INSTANCE  

return INSTANCE;  

}  


使用场景

1、工具类对象

2、系统中只能存在一个实例的类

3、创建频繁或又耗时耗资源且又经常用到的对象


下面是单例模式在JDK的应用

另外,spring容器中的实例默认是单例饿汉式类型的,即容器启动时就实例化bean到容器中,当然也可以设置懒汉式defalut-lazy-init="true"为延迟实例化,用到时再实例化。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win7精简_低配电脑的福音:这款小众系统10GB+极限精简+不卡顿,比Win7还快!

自win7停服后,不少用户私信老毛桃,问win10哪个版本的系统好用。这让我怎么回答呢,不同的使用要求安装的系统不一样,但总的来说,世界上没有最完美的系统,只有最适合自己的系统。也有不少用户在评论win10各种…

快慢指针:141. 环形链表(判断是否存在环路)

题目描述 给定一个链表,判断链表中是否有环 题目链接 141. 环形链表 解题思路 使用快慢指针(Floyd判圈算法):从链表的头部设置两个指针,p1的步长为1, p2的步长为2,同时向前走,如…

redis集群信息分析-cluster info-cluster nodes

【README】 本文po出 redis集群的节点信息,槽信息,以及字段含义 【1】集群信息 192.168.163.203:6380> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluste…

彻底理解正向代理和反向代理

转载自 彻底理解正向代理和反向代理平时工作中我们会接触到各种代理,它到底是什么概念呢,又是什么工作原理,下面我们具体来分析一下。1、概念正向代理这个很好理解,比如说你现在要访问一个外国的社交网站www.facebook.com&#xf…

查看电脑重启日志_系统日志看硬盘故障图文教程,电脑日志查看磁盘硬盘坏道问题方法...

大家好,我是老盖,感谢观看本篇文章,本文做的也有视频,也可以看我发布的视频。今天和大家讲一下通过电脑的系统日志,判断硬盘是否有问题的一个方法,最近这几天我这个电脑偶尔会卡一下,有的时候还…

redis集群依赖ruby

【README】 redis集群依赖ruby,需安装ruby环境,ruby版本需高于2.2。在创建redis集群前,需要安装ruby ,命令如下 yum install ruby yum install rubygems gem install redis 【1】什么是 rubygems 转自 https://www.jianshu.c…

Springboot配置通过URL访问图片(静态资源)

一、确保为web项目,创建WebConfig 实现WebMvcConfigurer (推荐)或 继承WebMvcConfigurationSupport 说明: SpringBoot2.0 配置WebMvc 需extends WebMvcConfigurationSupport或implements WebMvcConfigurerSpring Boot中只能有一…

区块链技术

转载自 区块链技术最近影响极大的“勒索”病毒袭转全球,造成数以万计的电脑中毒,主要是通过AES/RSA加密电脑办公文件,此种加密方式没有私钥无法解密,黑客提供了解密的方式,就是按黑客提供的交易方式“比特币”交易&…

Springboot实现文件上传,并防止同文件重复上传

目录主要流程编写接受文件上传的Controller编写文件操作结果类编写文件操作类知识总结参考主要流程 在配置文件中添加文件操作的配置,示例: storage:image:#保存位置save-path: D:\classdesign-photo\images\#允许上传的类型allow-type:- jpg- png编写…

asp 执行 exe_EXE程序加密锁下载-EXE程序加密锁电脑版下载v5.0

exe是Windows电脑上常见的程序运行文件格式,EXE程序加密锁能够将该种类型的文件进行加密,帮助用户控制某个软件的使用权限,它的体积可以忽略不计,操作方法也很简单。软件特色EXE程序加密锁是一个功能强大的exe程序锁,能…

dubbo服务调试管理实用命令

转载自 dubbo服务调试管理实用命令 公司如果分项目组开发的,各个项目组调用各项目组的接口,有时候需要在联调环境调试对方的接口,可以直接telnet到dubbo的服务通过命令查看已经布的接口和方法,并能直接invoke具体的方法&#xff…

转-聚合查询变慢-详解Elasticsearch的Global Ordinals与High Cardinality

转自: https://blog.csdn.net/zwgdft/article/details/83215977 【README】 Elasticsearch中的概念很多,本文将从笔者在实践过程中遇到的问题出发,逐步详细介绍 Global Ordinals 和 High Cardinality ,这也是笔者的认知过程。文中…

SpringBoot配置Mybatis的两种方式(通过XML配置和通过YML配置文件配置)

一、 通过XML的方式配置Mybatis 在 /src/main/resource下创建Mybatis配置文件 mybatis-config.xml 和 映射文件目录mapper在application.yml指定Mybatis配置文件、映射文件的位置 可选: - mybatis.config-location:配置 mybatis-config.xml 路径mybatis…

cmw500综合测试仪使用_山西优质三相直流电阻测试仪图片-南电合创

感谢您关注我们的产品,本公司除了有此产品介绍以外,还有太阳能接线盒测试仪,绝缘电阻测试仪,回路电阻测试仪,变压器直流电阻测试仪,无线高压核相仪,微机继电保护测试仪,电能质量分析…

内连接,外链接(左连接、右连接、全连接),交叉连接大总结

转载自 内连接,外链接(左连接、右连接、全连接),交叉连接大总结1.什么是连接查询呢?概念:根据两个表或多个表的列之间的关系,从这些表中查询数据。目的:实现多个表查询操作。2.分类&…

redis创建集群报错can‘t connect to node 192.168.163.203

【README】 创建集群报错 cant connect to node 192.168.163.203 [rootcentos201 ~]# /usr/local/redis-cluster/bin/redis-trib.rb create --replicas 0 192.168.163.201:6379 192.168.163.202:6379 192.168.163.203:6379 >>> Creating cluster Connecting to no…

SpringMVC控制器方法获取参数时@RequestParam注解加与不加的区别

问题 在使用SpringMVC时获取参数时,加与不加RequestParam都会自动传入参数值,那加与不加的区别是什么? 测试 GetMapping("test1")public String test1(String s){return "参数:"s;}GetMapping("test2&…

如何设置电脑自动锁屏_这个手机锁屏密码竟可以根据时间而变化!密码每分钟都会发生改变...

如今,手机已经成为了我们生活中不可或缺的一部分。手机里面承载了我们太多的个人信息、生活隐私,财产安全等等。为了防止别人偷窥我们的手机,我们都会将手机设置锁屏密码。相信大家锁屏设置的都是图形或者数字密码。但是这样的密码很容易被人…

我猜,每个程序员对着电梯都想过调度算法吧

转载自 我猜,每个程序员对着电梯都想过调度算法吧 传统电梯调度算法 1.1 先来先服务算法(FCFS) 先来先服务(FCFS-First Come First Serve)算法,是一种随即服务算法,它不仅仅没有对寻找楼层进行…

redis集群添加节点报错Either the node already knows other nodes (check with CLUSTER NODES) or contains some k

【README】 redis集群添加节点报错 [ERR] Node 192.168.163.202:6380 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0. 【1】 原因 导致异常的主要原因是该节点中默认生成的配置或历史存储数据…