上週開發的時候需要做乙個校驗使用者姓名格式的類,因為提供的是公共功能,類似於工具類,所以最好拿來就能用。內部邏輯大體如下所示:
public class namevalidateutil else}private boolean validateenglishname(string name)
private boolean validatechinesename(string name)
private boolean ischinesename(string name)
}
可以看到,校驗邏輯比較多,不適合放在乙個方法裡,如果給每乙個方法都加上static也可以做到拿來即用,但這樣的設計不夠優雅。既然不適合直接用靜態的方式,那麼很容易就會想到可以用單例模式來實現。其實說實話,在這之前雖然博主也將23中設計模式了解過一遍,但是大多未在專案中實際操作過,所以對設計模式使用的必然性缺少認識,而這一次便讓我切身體會到了適合單例模式的使用場景。如上所述的,如果乙個類提供的是公共的功能,且不方便給其方法設定成static靜態的,那麼就可以使用單例模式來實現。
對於單例模式,園友們應該都知道老生常談的那兩種:餓漢式和懶漢式。基本的實現方式大家都清楚,此處就不貼了。餓漢式雖然不會出現執行緒安全的情況,但除非某些特殊場景,一般都不使用。而一般的懶漢式,對於執行緒安全的解決辦法是雙重檢查鎖(dubbo-check),如下所示:
public class namevalidateutilprivate static namevalidateutil namevalidateutil;
public static namevalidateutil getsingleton()}}
return namevalidateutil;
}}
但由於jvm的記憶體模型中允許指令重排序,即在
namevalidateutil = new namevalidateutil();這句的三步(a.分配記憶體位址;b.初始化;c.將記憶體位址傳給引用)中,b與c可能會c先執行,b後執行,這樣在高併發的情況下,就可能會出現某個執行緒獲取到了未完成初始化的物件的情況。為避免此情況,可以通過給namevalidateutil加volatile關鍵字的方式來避免重排序。
或者使用靜態內部類的方式(靜態內部類是在使用的時候才會初始化,且jvm能保證只初始化一次),**如下所示:
public class namevalidateutilprivate static namevalidateutil namevalidateutil;
public static namevalidateutil getsingleton()
private static class innernamevalidateutil
}
九月份加班成魔,學習進度嚴重落後,十月份應該就回歸正軌了,務必抓緊時間學習!
單例設計模式(餓漢單例設計模式 懶漢單例設計模式)
1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...
設計模式 單例設計模式
歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...
設計模式 單例設計模式
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...