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