您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Java單例創建方式有哪些”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java單例創建方式有哪些”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
單例設計模式,就是采取一定的方法保證在整個的軟件系統中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法(靜態方法)
對于一些需要頻繁創建銷毀的對象
重量級的對象
經常使用到的對象
工具類對象
數據源
session
代碼
/** * 餓漢式(靜態常量) * 優勢:簡單,避免多線程的同步問題 * 劣勢:無懶加載,內存浪費 * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton1 { // 私有化構造方法 private Singleton1(){} // 靜態常量 private static final Singleton1 singleton1 = new Singleton1(); // 對外提供公共方法 public static Singleton1 getSingleton1(){ return singleton1; } }
分析
優勢:簡單,避免多線程的同步問題
劣勢:無懶加載,內存浪費
代碼
/** * 餓漢式(靜態代碼塊) * 優勢:簡單,避免多線程的同步問題 * 劣勢:無懶加載,內存浪費 * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton2 { // 私有化構造方法 private Singleton2(){} private static final Singleton2 singleton2; // 靜態代碼塊 static { singleton2 = new Singleton2(); } // 對外提供公共方法 public static Singleton2 getSingleton2(){ return singleton2; } }
分析
優勢:簡單,避免多線程的同步問題
劣勢:無懶加載,內存浪費
代碼
/** * 懶漢式(線程不安全) * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton3 { // 私有化構造方法 private Singleton3(){} // 內部屬性 private static Singleton3 singleton3; // 對外提供公共方法 public static Singleton3 getSingletons(){ if(singleton3 == null){ singleton3 = new Singleton3(); } return singleton3; } }
分析
優勢:起到了懶加載的效果 不會造成內存浪費
劣勢:線程不安全 不推薦這種方式的
代碼
/** * 懶漢式(同步方法) * 優勢:解決了線程同步問題 * 劣勢:使用synchronized同步關鍵字,性能太低 * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton4 { // 私有化構造方法 private Singleton4(){} // 內部屬性 private static Singleton4 singleton4; // 對外提供公共方法 public static synchronized Singleton4 getSingleton4(){ if(singleton4 == null){ singleton4 = new Singleton4(); } return singleton4; } }
分析
優勢:解決了線程安全問題,
劣勢:效率太低
代碼
/** * 懶漢式(同步代碼塊) * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton5 { // 私有化構造方法 private Singleton5(){} // 內部屬性 private static Singleton5 singleton5; // 對外提供公共方法 public static Singleton5 getSingleton5(){ if (singleton5 == null){ synchronized (Singleton5.class){ singleton5 = new Singleton5(); } } return singleton5; } }
分析
優勢:起到了懶加載的效果 不會造成內存浪費
劣勢:線程不安全 不推薦這種方式的
代碼
/** * 雙重檢查鎖機制 * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton6 { // 私有化構造方法 private Singleton6(){} // 內部屬性 private volatile static Singleton6 singleton6; // 對外提供公共方法 public static Singleton6 getSingleton6(){ if (singleton6 == null){ synchronized (Singleton6.class){ if(singleton6 == null){ singleton6 = new Singleton6(); } } } return singleton6; } }
分析
實現了懶加載,效率很高,解決了線程安全
代碼
/** * 靜態內部類 * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton7 { // 私有化構造方法 private Singleton7(){} // 內部類 private static class SingleInstance{ public static final Singleton7 singleton7 = new Singleton7(); } // 對外提供公共方法 public static Singleton7 getSingleton7(){ return SingleInstance.singleton7; } }
分析
不會出現線程安全問題 JVM來幫我們保證了線程的安全性
利用靜態內部類的特點,效率也很高,
實際開發中推薦使用的
代碼
定義單例對象
/** * @desc: * @author:liyajie * @createTime:2022/2/11 10:25 * @version:1.0 */ public class Singleton { public void hello(){ System.out.println("hello"); } }
定義枚舉實例化單例對象
/** * 枚舉方式 * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ enum Singleton8 { // 相當于public static final Singleton8 INSTANCE; // 保證了枚舉實例只能被實例化一次 INSTANCE; // 定義單例變量 private Singleton singleton; // 枚舉構造方法,該構造方法是private,執行構造方法的時候,同時創建我們的單例對象 Singleton8() { singleton = new Singleton(); } // 對外提供公共方法 public Singleton getSingleton() { return singleton; } }
使用方法Singleton8.INSTANCE.getSingleton()即可獲取我們的單例對象了
分析
簡單,避免了線程安全問題
實際開發中推薦使用的
讀到這里,這篇“Java單例創建方式有哪些”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。