1. 程式人生 > 實用技巧 >java 單例模式:餓漢式與懶漢式

java 單例模式:餓漢式與懶漢式

餓漢式單例模式:HurrySingleton.java

 1 /**
 2  * className SignalDemo
 3  *  餓漢模式
 4  * @author JAVADaKUn
 5  * @date 2020/8/27
 6  * @version:1.0
 7  * @since:jdk:1.8
 8  */
 9 @Getter
10 @Setter
11 @AllArgsConstructor
12 public class SignalDemo1 {
13     private String name;
14     private Integer id;
15     //在類載入的時候就完成了初始化,載入速度慢,獲取物件速度快
16 private static SignalDemo1 signalDemo = new SignalDemo1(); 17 18 //構造私有 19 private SignalDemo1(){ 20 21 } 22 23 24 //方法公開,因為在類載入的時候就已經初始化,所有不加同步也不會出現執行緒問題 25 public static SignalDemo1 getInstance(){ 26 return signalDemo; 27 } 28 }


懶漢式單例模式:LazySignleton.java

 1
/** 2 * className SignalDemo2 3 * 4 * @author JAVADaKun 5 * @date 2020/8/27 6 * @version:1.0 7 * @since:jdk:1.8 8 */ 9 @Getter 10 @Setter 11 @AllArgsConstructor 12 public class SignalDemo2 { 13 private String name; 14 private Integer id; 15 //在類載入的時候,不建立例項,因此類載入速度較快,獲取物件速度較慢 16 private
static SignalDemo2 signalDemo = null; 17 18 //構造私有 19 private SignalDemo2(){ 20 21 } 22 23 //需要加上同步鎖,以保證執行緒安全,因為類變數在載入的時候,沒有初始化 24 public synchronized static SignalDemo2 getInstance(){ 25 if(signalDemo==null){ 26 signalDemo=new SignalDemo2(); 27 } 28 return signalDemo; 29 } 30 }

輸出比較:

 1 public class SignalTest {
 2     public static void main(String[] args) {
 3 
 4         System.out.println("1 "+ SignalDemo1.getInstance());
 5         //1 signal.SignalDemo1@1540e19d
 6 
 7         new Thread(()->{
 8             System.out.println("2 "+ SignalDemo1.getInstance());
 9         }).start();
10         //2 signal.SignalDemo1@1540e19d
11 
12         System.out.println("3 "+SignalDemo2.getInstance());
13         //3 signal.SignalDemo2@214c265e
14 
15         new Thread(()->{
16             System.out.println("4 "+SignalDemo2.getInstance());
17         }).start();
18         //4 signal.SignalDemo2@214c265e
19 
20     }
21 }

總結:

相同點:

一、二者需要保證構造私有化,並且需要提供一個公開靜態方法。

二、必須自己建立例項

不同點:

一、餓漢模式不論外界是否呼叫了獲取例項的方法,例項都已經初始化,呼叫方法,就是直接獲取物件。

二、懶漢模式是在外界呼叫獲取例項方法的時候,對例項進行初始化,並返回例項物件。

三、二者的獲取例項方法有所不同,雖然都需要加上 public 和 static關鍵字,不過懶漢模式的方法還需要加上同步鎖,以保證執行緒安全,

餓漢模式則不需要