初学单例模式

单例模式,即同一个类对外只提供一个对象,一般有饿汉式和懒汉式两种。

饿汉式:先实例化一个对象,将构造方法私有,对外只暴露获取该实例的静态方法

public class Singleton{
    private static final Singleton singleton=new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return singleton;
    }   
}

懒汉式:一般用于构造函数需要外界传值时使用。

public class Singleton{
    private static Singleton singleton;
    private Singleton(){}
    public static Singleton getInstance(){
        if(singleton==null){
            single=new Singleton();
        }
        return singleton;
    }
}

但是懒汉式是线程不安全的,因此需要加上同步锁。

//版本1.0
public synchronized stataic Singleton getInstance(){
    if(singleton==null){
        singleton=new Singleton();
    }
    return singleton;
}

但是这样,每次获得实例都要同步等待,效率低下,因此考虑把synchronized放到方法体内于是有

//版本2.0
public static Singleton getInstance(){
    if(singleton==null){
        synchronized(Singleton.class){
            singleton=new Singleton();
        }
    }
    return singleton();
}

但是这么一来,效率是上去了,但是同步锁却失效了,不同的线程可以进去if(singleton==null)后等待,也会产生线程安全问题,因此最后采取双重锁判断。

//最终版本
public class Singleton{
    privat static Singleton singleton;
    private Singleton(){}
    public static Singleton getInstance(){
        if(singleton==null){
            synchronized(Singleton.class){
                if(singleton==null){
                    singleton=new Singleton();
                    }
            }
        }
        return singleton;
    }
}

单例模式在android中使用范围比较广,比如在volley中,为了减少内存的浪费和管理的方便,一般将RequestQueue设计为单例模式以方便对于Request的统一管理。

以上是单例模式的介绍,一般情况下有限考虑饿汉式,因为没有线程安全问题,但是在特殊情况下,如类的构造需要传入一些参数,在android中常见 Context,此时就只能采取懒汉式的方法时。一旦设计线程并发操作,就要特别注意线程安全性问题了。

阅读更多
文章标签: singleton
想对作者说点什么? 我来说一句

C#单例模式

2011年12月02日 152KB 下载

单例模式单例模式单例模式

2011年07月31日 467KB 下载

研磨单例模式研磨单例模式

2010年12月15日 123KB 下载

单例模式(讲解单例模式)

2011年01月18日 317KB 下载

Java单例模式(DOC)

2009年10月21日 91KB 下载

php单例模式和工厂模式

2009年05月22日 54KB 下载

设计模式之单例模式

2017年12月01日 9KB 下载

JAVA单例模式

2013年11月14日 46KB 下载

单例模式---初学 优点--缺点

2009年02月22日 1KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭