常见的单例模式

2016-12-12  本文已影响0人  zEcongChai

饿汉式(线程不安全):

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

懒汉式:

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

大家或许已经注意到<code>synchronized</code>关键字,这使得在多线程的情况下保证单例对象的唯一性。这种方式在一定程度上节约了资源,但是第一次加载时需要及时进行实例化,反应稍慢,而且每次调用<code>getInstance()</code>都会进行同步,造成不必要的同步开销,不建议使用。

DCL方式实现单例(推荐)

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

DCL方式既实现了需要才初始化单例,又保证了线程安全,且<code>getInstance</code>调用时不立即进行同步锁,避免了不必要的开销。

单例在使用时需要注意:
单例对象如果持有<code>Context</code>,能容易造成内存泄漏,所以在传给单例对象的<code>Context</code>最好是<code>Application Context</code>

上一篇 下一篇

猜你喜欢

热点阅读