单例是指一个类仅有一个实例,经过提供的方法来做为全局的访问点html
public enum SingleTonEnum{
INSTANCE;
public static final SingleTonEnum getInstance(){
return INSTANCE;
}
}
复制代码
单例的优点java
单例实现的最困难方式在于,如何才能保证“全局”有且仅有一个实现,这里的“全局”则是针对不一样的使用场景来作各自的应用便可。好比如今的应用都会部署到多台机器上,每台机器上都会有各自的jvm,那是否有必要保证全部的机器上都是同一个单例呢?或者能够仅仅把全局限定在单个jvm呢?git
通常来说,限定在jvm便可github
当前通常的实现方式包括 使用枚举、双重检查、静态内部类与饿汉式等等spring
饿汉式与静态内部类相比,区别在于建立实例的时机,静态内部类须要用到的时候才加载,饿汉式则至关于类加载的时候就建立,饿汉实现的例子好比jdk自带的 Runtime 类,就是典型的应用bash
欢迎找到反射实现单例的同窗一块儿探讨,我的验证代码戳这里jvm
另外对于自定义类加载器,只要是遵循双亲加载模式的类加载器都能实现单例ui
实际上没有用到本身的类加载器,实现相同的类加载器spa
各实现方式在不一样场景下验证单例方式详情请戳这里code
spring能够在bean文件中设置建立的bean指定使用域为"singleton"
<bean id="paxi" class="maokitty.paxi"></bean>
复制代码
这种方式它默认就是实现了一个singleton,它是针对每一个IOC容器实现的
固然经过指定不一样的id,它也会为成功的建立另外一个实例,这也就是单例"全局"所特定的范畴。spring singleton源码追踪记录请戳这里
不但愿其它地方再建立一个实例的场景