JAVA中的單例設計(Singleton)模式

2021-08-04 08:00:52 字數 2345 閱讀 1800

一、單例模式有以下特點:

1、單例類只能有乙個例項。

2、單例類必須自己建立自己的唯一例項。

3、單例類必須給所有其他物件提供這一例項。

二、懶漢式

//懶漢式單例類

.在第一次呼叫的時候例項化自己

public class singleton   

private static singleton single=null;  

//靜態工廠方法

public static singleton getinstance()     

return single;  

}  }  

singleton通過將構造方法限定為private避免了類在外部被例項化,在同乙個虛擬機器範圍內,singleton的唯一例項只能通過getinstance()方法訪問

1、在getinstance方法上加同步

·  public static synchronized singleton getinstance()     

·          return single;  

·  } 

2、雙重檢查鎖定

·  public static singleton getinstance()     

·              }    

·          }    

·          return singleton;   

·      } 

3、靜態內部類

·  public class singleton     

·      private singleton (){}    

·      public static final singleton getinstance()     

·  } 

三、餓漢式單例

//餓漢式單例類

.在類初始化時,已經自行例項化

public class singleton1   

private static final singleton1 single = new singleton1();  

//靜態工廠方法

public static singleton1 getinstance()   

}  餓漢式的特點:

餓漢式在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不再改變,所以天生是執行緒安全的。

餓漢式和懶漢式區別

從名字上來說,餓漢和懶漢,

餓漢就是類一旦載入,就把單例初始化完成,保證getinstance的時候,單例是已經存在的了,

而懶漢比較懶,只有當呼叫getinstance的時候,才回去初始化這個單例。

另外從以下兩點再區分以下這兩種方式:

1、執行緒安全:

餓漢式天生就是執行緒安全的,可以直接用於多執行緒而不會出現問題,

懶漢式本身是非執行緒安全的,為了實現執行緒安全有幾種寫法,分別是上面的1、2、

3,這三種實現在資源載入和效能方面有些區別。

2、資源載入和效能:

餓漢式在類建立的同時就例項化乙個靜態物件出來,不管之後會不會使用這個單例,都會佔據一定的記憶體,但是相應的,在第一次呼叫時速度也會更快,因為其資源已經初始化完成,

而懶漢式顧名思義,會延遲載入,在第一次使用該單例的時候才會例項化物件出來,第一次呼叫時要做初始化,如果要做的工作比較多,效能上會有些延遲,之後就和餓漢式一樣了。

至於1、2、

3這三種實現又有些區別,

第1種,在方法呼叫上加了同步,雖然執行緒安全了,但是每次都要同步,會影響效能,畢竟

99%的情況下是不需要同步的,

第2種,在

getinstance

中做了兩次

null

檢查,確保了只有第一次呼叫單例的時候才會做同步,這樣也是執行緒安全的,同時避免了每次都同步的效能損耗

第3種,

利用了classloader的機制來保證初始化instance時只有乙個執行緒,所以也是執行緒安全的,同時沒有效能損耗,所以一般我傾向於使用這一種。

什麼是執行緒安全?

如果你的**所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段**。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。

或者說:乙個類或者程式所提供的介面對於執行緒來說是原子操作,或者多個執行緒之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題,那就是執行緒安全的。

Java中的單例設計模式

何為單例設計模式 乙個類在記憶體中只允許存在乙個物件 單例設計模式要保證物件的唯一性 如何保證物件的唯一性 1 為避免其他程式過多建立該類物件,先禁止其他程式建立該類物件 2 為讓其他程式可以訪問該類物件,先在本類中建立乙個物件 3 為了方便其他程式對物件的訪問,要提供一些訪問的方式 如何實現 1 ...

Java中的單例設計模式

設計模式 解決某一類問題最行之有效的方法。單例設計模式 解決乙個類在記憶體只存在乙個物件。想要保證物件唯一。1,為了避免其他程式過多建立該類物件。先禁止其他程式建立該類物件 2,還為了讓其他程式可以訪問到該類物件,只好在本類中,自定義乙個物件。3,為了方便其他程式對自定義物件的訪問,可以對外提供一些...

Java中的單例設計模式

這只是一點點 時間有限就先說這些吧,具體後面可以的話說說餓漢式和懶漢式,我也是初者,若有什麼出錯誤之處還請不吝賜教。單例設計模式 singleton 作用 可以保證乙個類的唯一性 使用場景 多個程式都要使用乙個配置檔案中的資料,而且實現資料共享和多程式的資料交換。必須要將多個資料封裝到乙個物件中,而...