【設(shè)計模式】——單例模式(餓漢式、懶漢式)

核心作用

  • 保證一個類只有一個實例,并且提供一個訪問該實例的全局訪問點

單例模式的優(yōu)點

  • 由于單例模式只生成一個實例,減少了系統(tǒng)性能開銷,當(dāng)一個對象的產(chǎn)生需要比較多的資源時,如讀取配置、產(chǎn)生其他依賴對象時,則可以通過在引用啟動時直接產(chǎn)生一個單例對象,然后永久駐留內(nèi)存的方式來解決
  • 單例模式可以在系統(tǒng)設(shè)置全局的訪問點,優(yōu)化環(huán)境共享資源訪問,例如可以設(shè)計一個單例類,負(fù)責(zé)所有的數(shù)據(jù)表的映射處理

常見的五種單例模式實現(xiàn)方式

  • 主要:
    • 餓漢式(線程安全,調(diào)用效率高。但是,不能延時加載)
    • 懶漢式(線程安全,調(diào)用效率不高。但是,可以延時加載)
  • 其他:
    • 雙中檢測鎖式(由于JVM底層內(nèi)部模型原因,偶爾會出問題[1]
    • 靜態(tài)內(nèi)部類(線程安全,調(diào)用效率高,可以延時加載)
    • 枚舉單例(線程安全,調(diào)用效率高,不能延時加載)

實例

  1. 餓漢式
/**
 * 測試餓漢式
 * @author admin
 *
 */

public class SingletonPattern01 {
    
    private static SingletonPattern01 st=new SingletonPattern01();
    
    private SingletonPattern01(){//構(gòu)造器私有化
        
    }
    
    public static SingletonPattern01 getInstance(){
        return st;
    }
    
}

問題:如果只是加載本類,而不是調(diào)用getInstance(),甚至永遠(yuǎn)不會調(diào)用,則會造成資源浪費(fèi)。

  1. 懶漢式
/**
 * 懶漢式
 * @author admin
 *
 */

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

資源利用率高了。但是每次調(diào)用getInstance()方法都要同步,并發(fā)效率低。


  1. 更新時間2018/8/5 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容