文档章节

单例模式

u
 udbwcso
发布于 2016/03/24 16:47
字数 448
阅读 61
收藏 3

单例模式

确保一个类只有一个实例,并提供一个全局访问点.

1.饿汉

public class Singleton {
    private static Singleton uniqueInstance = new Singleton();

    public static Singleton getInstance() {
        return uniqueInstance;
    }

    private Singleton() {
    }
}
public class Singleton {
    private static Singleton uniqueInstance;

    static {
        uniqueInstance = new Singleton();
    }

    public static Singleton getInstance() {
        return uniqueInstance;
    }

    private Singleton() {
    }
}

没有实现懒加载.

2.懒汉

public class Singleton {
    private static Singleton uniqueInstance;

    public static Singleton getInstance() {
        if(uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }

    private Singleton() {
    }
}

线程不安全,在多线程的情况下可能会出现多个实例.

public class Singleton {
    private static Singleton uniqueInstance;

    public static synchronized Singleton getInstance() {
        if(uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }

    private Singleton() {
    }
}

通过增加synchronized关键字到getInstance()方法中,使每个线程在进入这个方法之前要先等候别的线程离开这个方法,也就是说不会有两个线程同步进入这个方法.但同步会降低性能并且只有第一执行此方法时才需要同步,设置好uniqueInstance这个变量后就不需要再同步这个方法.

3.静态内部类

public class Singleton {

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

    private Singleton() {
    }

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
}

这种方式利用classloder的机制来保证初始化instance时只有一个线程,饿汉只要Singleton类被装载了,instance就会被实例化,没有达到lazy loading效果,而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有通过调用getInstance方法,才会装载SingletonHolder类,从而实例化instance。

4.双重检查加锁

public class Singleton {
    private volatile static Singleton uniqueInstance;

    public static Singleton getInstance() {
        if(uniqueInstance == null){
            synchronized(Singleton.class) {
                if(uniqueInstance == null){
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }

    private Singleton() {
    }
}

关于volatile可参考:Java 理论与实践: 正确使用 Volatile 变量

5.枚举

public enum Singleton {
    INSTANCE;
    public void doSomething(){
        
    }
}


© 著作权归作者所有

共有 人打赏支持
u
粉丝 80
博文 66
码字总数 15709
作品 0
武汉

暂无文章

造谣造到t-io老巢了

只发当事人的截图,不发表评论,以免有引导嫌疑 PS1:截图是由不同的人发过来的 PS2:本人已经不在此微信群 PS3:图3是2018-09-23的t-io官方群的一个发言小统计

talent-tan
11分钟前
15
0
heartbeat 资源

drbd+apache+heartbeat : http://blog.51cto.com/11838039/1827901 heartbeat双机热备的架设 : http://blog.51cto.com/11838039/1827560 对heaetbeat的深一步认识 : http://blog.51cto.co......

寰宇01
45分钟前
3
0
Spring 转换 model 为 json 时增加属性

缘起 目前的项目中有个需求是在附件对象转换成 json 时增加个 url 属性,以前的方式是在返回附件对象或列表时候做一次统一处理,这次想看看 spring 或者 jackson fasterxml 是否自带类似功能...

郁也风
今天
1
0
10大PHP比特币开源项目

如果你是一个Phper,如果你希望学习区块链,那么本文列出的 10个开源的Php比特币项目,将有助于你了解在自己的应用中 如何加入对比特币的支持。 如果你希望快速掌握使用Php对接比特币钱包的方...

汇智网教程
今天
1
0
springclould feign客户端添加全局参数

用springclould feign作为调用服务的客户端,一般来说参数可以写在feignclient的方法参数里 有时需要所有feign请求都统一添加一些参数,例如token用于鉴权等,可以这样做: 添加一个配置类,...

canneljls
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部