Java設(shè)計(jì)模式之單例模式簡(jiǎn)析
什么是單例模式?
單例模式是常用的設(shè)計(jì)模式,在我們的系統(tǒng)乃至在框架中都普遍被用到,單例模式就是使一個(gè)類有且只有一個(gè)實(shí)例用于外部訪問,這樣大大的節(jié)省了系統(tǒng)的資源,而單例模式需要注意的也就以下三點(diǎn):
- 保證這個(gè)類有且只有一個(gè)實(shí)例
- 自行創(chuàng)建這個(gè)實(shí)例
- 提供這個(gè)實(shí)例供外部訪問
代碼實(shí)現(xiàn)需要注意的就是
- 單例模式的類構(gòu)造方法私有化
- 這個(gè)類的定義中包含自己的一個(gè)靜態(tài)實(shí)例對(duì)象
- 提供一個(gè)共有靜態(tài)方法供外部調(diào)用
三種實(shí)現(xiàn)方式
1、懶漢式
懶漢式與延遲初始化有些相似,就是沒人用的時(shí)候我不實(shí)例化出來,有人需要調(diào)用了我再實(shí)例化出來,JAVA代碼實(shí)現(xiàn)如下
public class SingletonClz{
//實(shí)例
private static SingletonClz instance = null;
//私有構(gòu)造
private SingletonClz(){}
//外部調(diào)用方法
public static getInstance()
{
if(null == instance)
{
instance = new SingletonClz();
return instance;
}
else
{
return instance;
}
}
}2、餓漢式
先實(shí)例化出來,有人用就直接返回即可
public class SingletonClz{
//實(shí)例
private final static SingletonClz INSTANCE = new SingletonClz();
//私有構(gòu)造
private SingletonClz(){}
//外部調(diào)用方法
public static getInstance()
{
return instance;
}
}3、加鎖的單例模式
public class SingletonClz{
//實(shí)例
private static SingletonClz instance = null;
//私有構(gòu)造
private SingletonClz(){}
//外部調(diào)用方法
public static getInstance()
{
synchronized(SingletonClz.class)
{
if(null == instance)
{
instance = new SingletonClz();
}
}
return instance;
}
}這里加一個(gè)重量級(jí)的鎖是為了防止并發(fā)的情況下兩個(gè)線程同時(shí)訪問這個(gè)方法同時(shí)發(fā)現(xiàn)instace為null,就都跑去實(shí)例化這個(gè)對(duì)象了。
加了一個(gè)synchronized鎖就防止了這一情況的發(fā)生,當(dāng)有一個(gè)線程拿到了鎖,另一個(gè)就阻塞在外面知道鎖的釋放,當(dāng)線程A實(shí)例化完成并釋放鎖后,B進(jìn)來發(fā)現(xiàn)instace不等于空了,就不會(huì)再去實(shí)例化了。
到此這篇關(guān)于Java設(shè)計(jì)模式之單例模式簡(jiǎn)析的文章就介紹到這了,更多相關(guān)Java單例模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中StringBuilder字符串類型的操作方法及API整理
Java中的StringBuffer類繼承于AbstractStringBuilder,用來創(chuàng)建非線程安全的字符串類型對(duì)象,下面即是對(duì)Java中StringBuilder字符串類型的操作方法及API整理2016-05-05
Spring Security使用多種加密方式進(jìn)行密碼校驗(yàn)的代碼示例
在Web應(yīng)用中,密碼的安全存儲(chǔ)和驗(yàn)證是至關(guān)重要的,本文將通過一個(gè)具體的代碼示例,介紹和總結(jié)如何在Spring Security中使用多種加密方式進(jìn)行密碼校驗(yàn),文中通過代碼講解得非常詳細(xì),需要的朋友可以參考下2024-06-06
Spring中如何動(dòng)態(tài)注入Bean實(shí)例教程
這篇文章主要給大家介紹了關(guān)于Spring中如何動(dòng)態(tài)注入Bean的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Java修改eclipse中web項(xiàng)目的server部署路徑問題
這篇文章主要介紹了Java修改eclipse中web項(xiàng)目的server部署路徑,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
SpringBoot整合mybatis/mybatis-plus實(shí)現(xiàn)數(shù)據(jù)持久化的操作
這篇文章主要介紹了SpringBoot整合mybatis/mybatis-plus實(shí)現(xiàn)數(shù)據(jù)持久化,本節(jié)內(nèi)容我們介紹了數(shù)據(jù)持久化的相關(guān)操作,并且是基礎(chǔ)傳統(tǒng)的關(guān)系型數(shù)據(jù)庫——mysql,需要的朋友可以參考下2022-10-10
java進(jìn)行error捕獲和處理示例(java異常捕獲)
通常來說,大家都是對(duì)Java中的Exception進(jìn)行捕獲和進(jìn)行相應(yīng)的處理,有些人說,error就無法捕獲了。其實(shí),error也是可以捕獲的。Error和Exception都是Throwable的子類。既然可以catch Throwable,那么error也是可以catch的2014-01-01

