您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Java中單例模式怎么用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
1、單例類只能有一個實例。
2、單例類必須自己創建自己的唯一實例。
3、單例類必須給所有其他對象提供這一實例。
1.在內存里只有一個實例,減少了內存的開銷,尤其是頻繁的創建和銷毀實例(比如管理學院首頁頁面緩存)。
2.避免對資源的多重占用(比如寫文件操作)。
1.沒有接口,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎么樣來實例化。
1.要求生產唯一序列號。
2.WEB 中的計數器,不用每次刷新都在數據庫里加一次,用單例先緩存起來。
3.創建的一個對象需要消耗的資源過多,比如 I/O 與數據庫的連接等。
package com.asurplus.common.singleton.style1; import lombok.extern.slf4j.Slf4j; import java.util.Objects; @Slf4j public class ResUtils { private volatile static ResUtils instance = null; /** * 私有的構造方法 */ private ResUtils() { } /** * 提供獲取實例的方法 * * @return */ public static ResUtils getInstance() { // 為空才創建 if (Objects.isNull(instance)) { // 避免并發操作時 synchronized (ResUtils.class) { // 為空才創建 if (Objects.isNull(instance)) { // 創建新對象 instance = new ResUtils(); log.info("創建了對象"); } } } return instance; } }
我們將其構造方法私有化,從而外部無法創建實例,并且我們提供了獲取唯一實例的方法,這樣我們就能從外部得到該實例。
package com.asurplus.common.singleton.style2; import lombok.extern.slf4j.Slf4j; @Slf4j public class ResUtils2 { /** * 靜態內部類 */ private static class ResUtils2Holder { private static ResUtils2 instance = new ResUtils2(); } /** * 提供獲取實例的方法 * * @return */ public static ResUtils2 getInstance() { return ResUtils2Holder.instance; } }
我們使用靜態內部類的方法創建實例,因為 JVM 只會加載一次的原理,所以最終只會創建一個實例,并且提供了獲取實例的方法,這樣我們就能從外部得到該實例。
package com.asurplus.common.singleton; import com.asurplus.common.singleton.style1.ResUtils; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 單例模式 */ public class TestMain { public static void main(String[] args) { // 創建線程池 ExecutorService executorService = Executors.newFixedThreadPool(10); for (int i = 0; i < 100; i++) { executorService.execute(ResUtils::getInstance); } executorService.shutdown(); } }
輸出結果
可以看出,我們獲取了 100 次實例,只創建了一個實例,從而實現了我們的單例模式。
感謝各位的閱讀!關于“Java中單例模式怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。