天天看點

單例模式:餓漢和懶漢

接下來就說下單例模式了,這個在實際應用還是比較常用的!

首先,單例分為懶漢式和餓漢式:

餓漢式:類加載的時候,建立對象。 是以類加載速度慢, 線程相對安全

懶漢式:類加載的時候,不會建立對象,調用時才會建立對象。是以類加載速度快,線程相對不安全,一般要配合synchronized使用。

廢話少說,下面是餓漢式:

支援延遲加載

public class Single {
    
        //餓漢式:
        private static Single single=new Single();
    
        private Single() {
        }
    
        public static Single getSingle(){
            return single;
        }
    
    }
           

單例模式思路:

  1. 私有屬性
  2. 私有構造方法
  3. 公開的getSingle方法

單例模式作用:

保證了對象的唯一性

- 适用場景:

1.需要生成唯一序列的環境

2.需要

頻繁執行個體化然後銷毀

的對象。

3.建立對象時

耗時過多或者耗資源過多

,但又經常用到的對象。

4.友善資源互相通信的環境

懶漢式如下:

不支援延遲加載。加了鎖導緻這個函數的并發度很低

public class Single2 {

    //懶漢式:
    private static Single2 single=null;

    private Single2(){

    }
    /**
     * 懶漢模式在使用時,容易引起不同步問題,是以應該建立同步"鎖"
     * @return
     */
    public static Single2 getSingle(){
    
     	 synchronized (this){ 
    		if(single==null){
                single=new Single2();
            }
        }
        return single;
    }    
}
           

雙重檢測機制

既保證了線程安全,又能做到延遲加載。

解決了懶漢式并發度低的問題

public class Singleton5 {
    private static Singleton5 singleton5 = null;

    private Singleton5() {

    }

    public Singleton5 getSingleton5() {
        if (singleton5 == null) {
            synchronized (Singleton5.class) {  //類級别鎖
                if (singleton5 == null) {
                    singleton5 = new Singleton5();
                }
            }
        }
        return singleton5;
    }


}
           

最後咱們來談下,單例模式的優缺點:

優點:

1.實作了對唯一執行個體通路的可控

2.對于一些需要

頻繁建立和銷毀的對象

來說可以

提高系統的性能。

缺點:

1.

不适用于變化頻繁的對象

2.濫用單例将帶來一些負面問題,如為了節省資源将資料庫連接配接池對象設計為的單例類,可能會導緻共享連接配接池對象的程式過多而出現連接配接池溢出。

3.如果執行個體化的對象長時間不被利用,系統會認為該對象是垃圾而被回收,這可能會導緻對象狀态的丢失。

以上有寫的不對的地方,請及時通知部落客,以做修改!!!!

繼續閱讀