内容简介:单例是指一个类仅有一个实例,通过提供的方法来作为全局的访问点实现例子如下单例的优势
单例是指一个类仅有一个实例,通过提供的方法来作为全局的访问点
实现例子如下
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源码追踪记录请戳这里
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Spring in Action
Craig Walls / Manning Publications / 2011-6-29 / USD 49.99
Spring in Action, Third Edition has been completely revised to reflect the latest features, tools, practices Spring offers to java developers. It begins by introducing the core concepts of Spring and......一起来看看 《Spring in Action》 这本书的介绍吧!