单例模式

1,最简单的实现

    首先在类中新建一个私有的构造函数,这样类就不能被实例话了。然后在类中新建一个私有的静态实例,然后提供一个public方法访问该静态方法,这样使用着就可以使用这个类的实例了。

public class SingletonClass{
    pirvate static SingletonClass sInstance = new SingletonClass();
    
    public SingletonClass getInstance(){
        return sInstance;
    }    
    
    private SingletonClass(){
    }
}

 

2,性能优化--------Lazy loaded

    上例中不管SingletonClass是否使用都会新建一个实例,如果SingletonClass 很耗时,并且可能用不到。代码的变化有两区,一是新建一个实例,赋值为空,知道第一次使用的时候才会赋值。

public class SingletonClass{
    private static SingletonClass sInstance = null;

    public SingletonClass getInstance(){
        if(null == sInstance){
            sInstance = new SingletonClass();
        } 
     
     return sInstance;    
    }
    private SingletonClass(){
    }
}

 

3,同步

    上述程序在单线程没有问题,当在多线程下,比喻A线程希望使用SingletonClass实例,第一次调用,发现sInstance是空,就新建sInstance实例,就在这个时候CPU发生时间片切换,切换到进程B,B也要使用实例,因为切换发生在A线程检测完后,所以sInstance是空。这时候A和B线程就会新建不同的实例。

public class SingletonClass{
    pirvate static SingletonClass sInstance = null;

    public synchronized SingletonClass getInstance(){
        if(null == sInstance){
           sInstance = new SingletonClass(); 
       }

        return sInstance;
    }

    private SingletonClass(){}
}

    需要使用同步锁,一个线程必须等待另一个线程新建完后,才能使用,这样保证了实例的唯一性。

 

4,又是性能  

    每次调用实例前,先判断是否为空,如果为空,在同步新建,如果不为空,直接返回,

public class SingletonClass{
    private atatic SingletonClass sInstance = null;

    public SingletonClass getInstance(){
        if(null == sInstance){
            synchronized(SingletonClass.class){
                sInstance = new SingletonClass(); 
           }
        }

        return sInstance;
    }

    private SingletonClass(){}   
}

  

 

posted @ 2015-12-24 10:32  maxiongying  阅读(212)  评论(0)    收藏  举报