您好,登錄后才能下訂單哦!
這篇文章主要講解了“java怎么實現單例模式”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java怎么實現單例模式”吧!
某個類只能有一個實例
構造器私有化
它必須自行創建這個實例
含有一個該類的靜態變量來保存這個唯一實例
必須自行先整個系統提供這個實例
對外提供獲取該實例對象的方式
直接暴露
用靜態變量的 get 方法獲取
餓漢式:直接創建對象不存在線程安全問題
直接實例化餓漢式(簡潔直觀)
枚舉式(最簡潔)
靜態代碼塊餓漢式(適合復雜實例化)
懶漢式:延遲創建對象
線程不安全(適用于單線程)
線程安全(適用于多線程)
靜態內部列形式(適用于多線程)
直接實例化對象,不管是否需要這個對象-餓漢式
/* * 餓漢式 *(1)構造器私有化 *(2)自行創建,并用靜態變量保存 *(3)向外提供這個實例 *(4)強調這是單例,用final修飾(這個變量只能賦值一次,之后不能修改) */ public class Singleton1 { public static final Singleton1 INSTANCE = new Singleton1(); private Singleton1 (){ } }
枚舉-jdk1.5之后-餓漢式
/* *餓漢式 *枚舉類型:表示該類型的對象是有限的幾個 *我們可以限定為一個,就成了單例 */ public enum Singleton2{ INSTANCE }
靜態代碼塊-餓漢式
/* * 這種方式,適合那種需要從配置文件里面讀一堆信息來實例化。 */ public class Singleton3 { public static final Singleton3 INSTANCE; private String info; static { try { Properties pro = new Properties(); // 從位于src目錄下的配置文件single.properties中讀取信息 pro.load(Sinfleton3.class.getClassLoader().getResourceAsStream("single.properties")); INSTANCE = new Singleton3(pro.getPropertied("info")); }catch(IOExcepption e){ throw new RuntimeException(e); } } private Singleton3 (String info){ this.info = info; } }
4.線程不安全(適合單線程)-懶漢式
/* * 懶漢式 *(1)構造器私有化 *(2)靜態變量保存 *(3)提供一個靜態方法,獲取實例對象 */ public class Singleton4 { private static Singleton4 instance; private Singleton4 (){ } public static Singleton4 getInstance(){ if(instance == null){ //加上Thread.sleep(100);多線程情況下 會實例化兩個對象。 instance = new Singleton4(); } return instance; } }
線程安全(適合多線程)-懶漢式
/* * 懶漢式 *(1)構造器私有化 *(2)靜態變量保存 *(3)提供一個靜態方法,獲取實例對象 */ public class Singleton5 { private static Singleton5 instance; private Singleton5 (){ } public static Singleton5 getInstance(){ if(instance == null){//先判斷是否為空,再進行加鎖。 synchronized(Singleton5.class){ //加上Thread.sleep(100);多線程情況下 會實例化兩個對象。 instance = new Singleton5(); } } return instance; } }
靜態內部類形式
/* * 再內部類被加載和初始化時,才創建INSTANCE實例對象 * 靜態內部類不會自動隨著外部類的加載和初始化而初始化,它是要單獨去加載和初始化的 * 因為是在內部類加載和初始化是,創建的,因此是線程安全的。 */ public class Singleton6 { private Singleton6 (){ } private static class Inner{ private static final Singleton6 INSTANCE = new Singleton6(); } public static Singleton6 getInstance(){ return Inner.INSTANCE; } }
感謝各位的閱讀,以上就是“java怎么實現單例模式”的內容了,經過本文的學習后,相信大家對java怎么實現單例模式這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。