Java實(shí)現(xiàn)單例模式的五種方式總結(jié)
如何實(shí)現(xiàn)一個(gè)單例
1、構(gòu)造器需要私有化
2、提供一個(gè)私有的靜態(tài)變量
3、暴露一個(gè)公共的獲取單例對(duì)象的接口
需要考慮的兩個(gè)問題
1、是否支持懶加載
2、是否線程安全
1、餓漢式
public class EagerSingleton { private static final EagerSingleton INSTANCE = new EagerSingleton(); private EagerSingleton(){} public EagerSingleton getInstance(){ return INSTANCE; } }
不支持懶加載
線程安全
2、懶漢式
public class LazySingleton { private static LazySingleton INSTANCE; private LazySingleton() { } public static LazySingleton getInstance() { if (INSTANCE == null) { INSTANCE = new LazySingleton(); } return INSTANCE; } }
支持懶加載
線程不安全
public class LazySingleton { private static LazySingleton INSTANCE; private LazySingleton() { } public static synchronized LazySingleton getInstance() { if (INSTANCE == null) { INSTANCE = new LazySingleton(); } return INSTANCE; } }
支持懶加載
線程安全
3、雙重檢查鎖
public class DoubleCheckSingleton { private static DoubleCheckSingleton INSTANCE; private DoubleCheckSingleton() { } public DoubleCheckSingleton getInstance() { if (INSTANCE == null) { synchronized (DoubleCheckSingleton.class) { if (INSTANCE == null) { INSTANCE = new DoubleCheckSingleton(); } } } return INSTANCE; } }
支持懶加載
線程安全
4、靜態(tài)內(nèi)部類
public class InnerSingleton { private InnerSingleton() { } public static InnerSingleton getInstance() { return Singleton.INSTANCE; } private static class Singleton { private static final InnerSingleton INSTANCE = new InnerSingleton(); } }
支持懶加載
線程安全
5、枚舉
public enum EnumSingleton { INSTANCE; }
總結(jié)
到此這篇關(guān)于Java實(shí)現(xiàn)單例模式的五種方式的文章就介紹到這了,更多相關(guān)Java實(shí)現(xiàn)單例模式方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java類實(shí)現(xiàn)日期的時(shí)間差的實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于java類實(shí)現(xiàn)日期的時(shí)間差的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-01-01如何在spring boot項(xiàng)目中使用Spring Security的BCryptPasswordE
本文介紹如何在Spring Boot項(xiàng)目中通過修改pom.xml引入安全依賴,添加配置類以解除默認(rèn)的HTTP請(qǐng)求攔截,以及如何創(chuàng)建BCryptPasswordEncoder對(duì)象進(jìn)行密碼的加密和匹配,通過這些步驟,可以有效地增強(qiáng)應(yīng)用的安全性2023-08-08mybatis?@InsertProvider報(bào)錯(cuò)問題及解決
這篇文章主要介紹了mybatis?@InsertProvider報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Java使用poi-tl設(shè)置word圖片環(huán)繞方式為浮于在文字上方
POI-TL 是一個(gè)基于 Apache POI 的 Java 庫,專注于在 Microsoft Word 文檔(.docx 格式)中進(jìn)行模板填充和動(dòng)態(tài)內(nèi)容生成,下面我們看看如何使用poi-tl設(shè)置word圖片環(huán)繞方式為浮于在文字上方吧2025-03-03Java中將UUID存儲(chǔ)為Base64字符串的方法實(shí)現(xiàn)
使用Base64編碼來對(duì)UUID存儲(chǔ)在一些特定的場(chǎng)合被廣泛的使用,本文主要介紹了Java中將UUID存儲(chǔ)為Base64字符串的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04SpringBoot整合log4j2日志的實(shí)現(xiàn)
在項(xiàng)目推進(jìn)中,如果說第一件事是搭Spring框架的話,那么第二件事情就是在Sring基礎(chǔ)上搭建日志框架,大家都知道日志對(duì)于一個(gè)項(xiàng)目的重要性,尤其是線上Web項(xiàng)目,因?yàn)槿罩究赡苁俏覀兞私鈶?yīng)用如何執(zhí)行的唯一方式。此篇文章是博主在實(shí)踐中用Springboot整合log4j2日志的總結(jié)2021-06-06Java基于循環(huán)遞歸回溯實(shí)現(xiàn)八皇后問題算法示例
這篇文章主要介紹了Java基于循環(huán)遞歸回溯實(shí)現(xiàn)八皇后問題算法,結(jié)合具體實(shí)例形式分析了java的遍歷、遞歸、回溯等算法實(shí)現(xiàn)八皇后問題的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-06-06Java搭建簡(jiǎn)單Netty開發(fā)環(huán)境入門教程
這篇文章主要介紹了Java搭建簡(jiǎn)單Netty開發(fā)環(huán)境入門教程,有詳細(xì)的代碼展示和maven依賴,能夠幫助你快速上手Netty開發(fā)框架,需要的朋友可以參考下2021-06-06