5分鐘搞定java單例模式
單例模式
單例模式(Singleton),也叫單子模式,是一種常用的軟件設計模式。在應用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統(tǒng)只需要擁有一個的全局對象,這樣有利于我們協(xié)調系統(tǒng)整體的行為。
比如在某個服務器程序中,該服務器的配置信息存放在一個文件中,這些配置數(shù)據(jù)由一個單例對象統(tǒng)一讀取,然后服務進程中的其他對象再通過這個單例對象獲取這些配置信息。這種方式簡化了在復雜環(huán)境下的配置管理。
單例模式的運用場景
外部資源:每臺計算機有若干個打印機,但只能有一個PrinterSpooler,以避免兩個打印作業(yè)同時輸出到打印機。
Windows的Task Manager(任務管理器)就是很典型的單例模式(這個很熟悉吧),想想看,是不是呢,你能打開兩個windows task manager嗎?
多線程的線程池的設計一般也是采用單例模式,這是由于線程池要方便對池中的線程進行控制。
實現(xiàn)單例模式的方法思路
一個類能返回對象一個引用(永遠是同一個)和一個獲得該實例的方法(必須是靜態(tài)方法,通常使用getInstance這個名稱);
當我們調用這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就創(chuàng)建該類的實例并將實例的引用賦予該類保持的引用。
同時我們 還將該類的構造函數(shù)定義為私有方法,這樣其他處的代碼就無法通過調用該類的構造函數(shù)來實例化該類的對象,只有通過該類提供的靜態(tài)方法來得到該類的唯一實例。
實現(xiàn)單例模式的方式
01懶漢單例式
天生線程不安全:這種方式是最基本的實現(xiàn)方式,這種實現(xiàn)最大的問題就是不支持多線程。因為沒有加鎖 synchronized,所以嚴格意義上它并不算單例模式。
天生線程不安全:這種方式具備很好的 lazy loading,能夠在多線程中很好的工作,但是,效率很低,99% 情況下不需要同步。
02餓漢單列式
這種方式比較常用,但容易產(chǎn)生垃圾對象。
03靜態(tài)內部類的方式
這種方式能達到雙檢鎖方式一樣的功效,但實現(xiàn)更簡單。對靜態(tài)域使用延遲初始化,應使用這種方式而不是雙檢鎖方式。這種方式只適用于靜態(tài)域的情況,雙檢鎖方式可在實例域需要延遲初始化時使用。
04枚舉
這種實現(xiàn)方式還沒有被廣泛采用,但這是實現(xiàn)單例模式的最佳方法。它更簡潔,自動支持序列化機制,絕對防止多次實例化。
資源加載和性能區(qū)別
餓漢式在類創(chuàng)建的同時就實例化一個靜態(tài)對象出來,不管之后會不會使用這個單例,都會占據(jù)一定的內存,但是相應的,在第一次調用時速度也會更快,因為其資源已經(jīng)初始化完成。
而懶漢式,會延遲加載,在第一次使用該單例的時候才會實例化對象出來,第一次調用時要做初始化,如果要做的工作比較多,性能上會有些延遲,之后就和餓漢式一樣了。
靜態(tài)內部類的方式資源利用率高,但第一次加載時反應不夠快;java中餓單例模式性能優(yōu)于懶單例模式,若對資源十分在意可以采用靜態(tài)內部類。
到此這篇關于5分鐘搞定java單例模式的文章就介紹到這了,更多相關Java 單例模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java API如何實現(xiàn)向Hive批量導入數(shù)據(jù)
這篇文章主要介紹了Java API如何實現(xiàn)向Hive批量導入數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07