单例模式

来源:互联网 发布:json代码格式化工具 编辑:程序博客网 时间:2024/04/30 03:09

学习设计模式推荐书籍《大话设计模式》

单例模式指在整个应用中只需要一个且也只能有一个实例。

应用场景:网站中统计访问量,数据库连接池,加载配置文件。

实现单例模式有通常有如下几种方法:

//懒汉式单例模式 在第一次调用时实例化自己public class Singleton {private static Singleton singleton;//构造函数一定要私有private Singleton(){}public static Singleton getInstance(){if(singleton ==null){singleton = new Singleton();}return singleton;}}

考虑到线程安全问题,在并发的情况下有可能创建多个实例。可以通过简单的加锁方式控制线程安全问题。

public class Singleton {private static Singleton singleton;//构造函数一定要私有private Singleton(){}public static synchronized Singleton getInstance(){if(singleton ==null){singleton = new Singleton();}return singleton;}}
但是这种方式会造成很多无谓的等待,多个线程访问时,只有一个可以访问该方法,其他的线程只能处于挂起等待的状态。

双重检查锁定:

public class Singleton {private static Singleton singleton;//构造函数一定要私有private Singleton(){}public static Singleton getInstance(){if(singleton ==null){synchronized (Singleton.class) {if(singleton ==null){singleton = new Singleton();}}}return singleton;}}

因为只有在实例为null时才会进行同步,否则返回实例,所以减少了其他线程的等待时间。当多个线程同时判断实例(singleton)为空时,其中的一个先获得了锁,返回了实例,其他线程再获得锁时因为已经有了实例再次执行singleton = new Singleton()时就违背了单例模式。所以又加了一层判断是否为null。

双重检查锁定方式看起来已经没有任何问题,但是仍然还是有问题的。此时涉及到JVM加载类的过程,本人尚未涉及,无法阐述。

最终版单例模式:

//静态内部类public class SingletonFactory {public Singleton getSingleton(){return Singleton.singleton;}private static class Singleton{protected static Singleton singleton = new Singleton();}}








原创粉丝点击