“单例”模式与它在源码中的运用

栏目: Java · 发布时间: 5年前

内容简介:单例是指一个类仅有一个实例,通过提供的方法来作为全局的访问点实现例子如下单例的优势

单例是指一个类仅有一个实例,通过提供的方法来作为全局的访问点

“单例”模式与它在源码中的运用

实现例子如下

public enum SingleTonEnum{
    INSTANCE;
    public static final SingleTonEnum getInstance(){
        return INSTANCE;
    }
}
复制代码

单例的优势

  • 对访问对象的严格控制
  • 不存在频繁创建对象与对象GC带来的消耗

单例多种实现方式对比

单例实现的最困难方式在于,如何才能保证“全局”有且仅有一个实现,这里的“全局”则是针对不同的使用场景来做各自的应用即可。比如现在的应用都会部署到多台机器上,每台机器上都会有各自的jvm,那是否有必要保证所有的机器上都是同一个单例呢?或者可以仅仅把全局限定在单个jvm呢?

一般来讲,限定在jvm即可

当前一般的实现方式包括 使用 枚举双重检查静态内部类 与饿汉式等等

饿汉式与静态内部类相比,区别在于创建实例的时机,静态内部类需要用到的时候才加载,饿汉式则相当于类加载的时候就创建,饿汉实现的例子比如jdk自带的 Runtime 类,就是典型的应用

  • 枚举:能够自适应序列化、反射、无法克隆
  • 双重检查:序列化、克隆业务场景需要特殊处理,当然,如果场景不需要支持序列化和克隆则是没有问题,在反射上则是无法避免只实现单例
  • 静态内部类:序列化、克隆场景需要特殊处理,同样不需要这些的场景也是没有问题,另外和双重检查一样,无法避免反射只有单例

欢迎找到反射实现单例的同学一起探讨, 个人验证代码戳这里

另外对于自定义类加载器,只要是遵循双亲加载模式的类加载器都能实现单例

实际上没有用到自己的类加载器,实现相同的类加载器

各实现方式在不同场景下验证单例方式详情请戳这里

spring中对bean设置 scope 为 singleton

spring可以在bean文件中设置创建的bean指定使用域为"singleton"

<bean id="paxi" class="maokitty.paxi"></bean>
复制代码

这种方式它默认就是实现了一个singleton,它是针对每个IOC容器实现的

官网文档戳这里

当然通过指定不同的id,它也会为成功的创建另一个实例,这也就是单例"全局"所特定的范畴。 spring singleton源码追踪记录请戳这里


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web应用安全权威指南

Web应用安全权威指南

德丸浩 / 赵文、刘斌 / 人民邮电出版社 / 2014-10 / 79

《web应用安全权威指南》系日本web安全第一人德丸浩所创,是作者从业多年的经验总结。作者首先简要介绍了web应用的安全隐患以及产生原因,然后详细介绍了web安全的基础,如http、会话管理、同源策略等。此外还重点介绍了web应用的各种安全隐患,对其产生原理及对策进行了详尽的讲解。最后对如何提高web网站的安全性和开发安全的web应用所需要的管理进行了深入的探讨。本书可操作性强,读者可以通过下载已......一起来看看 《Web应用安全权威指南》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

html转js在线工具
html转js在线工具

html转js在线工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具