interView - singleton的几种写法
来源:互联网 发布:男士内衣品牌推荐知乎 编辑:程序博客网 时间:2024/04/29 11:09
1.饿汉式
- public class Singleton {
- private static Singleton instance = new Singleton();
- private Singleton (){}
- public static Singleton getInstance() {
- return instance;
- }
- }
这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。
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 class SingletonHolder {
- private static final Singleton INSTANCE = new Singleton();
- }
- private Singleton (){}
- public static final Singleton getInstance() {
- return SingletonHolder.INSTANCE;
- }
- }
这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟第三种和第四种方式不同的是(很细微的差别):第三种和第四种方式是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三和第四种方式就显得很合理。
4.双重校验锁
- public class Singleton {
- private volatile static Singleton singleton;
- private Singleton (){}
- public static Singleton getSingleton() {
- if (singleton == null) {
- synchronized (Singleton.class) {
- if (singleton == null) {
- singleton = new Singleton();
- }
- }
- }
- return singleton;
- }
- }
0 0
- interView - singleton的几种写法
- singleton 的几种写法
- Singleton的几种实现
- 几种不同类型的Singleton
- 常用的Singleton写法
- Singleton的写法
- 爱的几种写法
- 几种分页的写法
- 几种分页的写法
- delegate的几种写法
- 登录的几种写法
- javascript 的几种写法
- Activity的几种写法
- 最大公约数的几种写法
- javascript的几种写法
- hql的几种写法
- hql的几种写法
- 倒计时的几种写法
- fscant 实例
- hdu-5018
- distributor之Software Generated Interrupt Register, GICD_SGIR
- 最短路?那是什么 °▽°
- Struts2 结果和结果类型
- interView - singleton的几种写法
- Jquery Ajax 登录,服务端分别为 aspx,ashx,asmx
- 兄弟郊游问题
- VNC介绍(第一篇)
- spring controller返回json字符串 @responsebody 乱码
- 一条网线,一个交换机,两台电脑通过拨号上网 ;一台路由器,多台电脑;
- android Application类的详细介绍
- 【lightOJ】 Partitioning Game (博弈,sg函数)
- div