單例模式顧名思義只能獲取乙個例項,那麼想要獲取例項就需要使用到構造方法,那麼我們如何達成只有乙個例項呢?就是不讓其他的類來使用我們的建構函式,我們可以將建構函式設定為private私有的,還要在單例類內預先放置乙個我們想對外提供的單一例項。並且向外提供乙個訪問到該單例類的方法或者將預留的單例設定為類的成員變數。
所謂的餓漢式可以這樣理解,餓了就需要吃那麼東西就必須有,所以就是立即載入也就是必須先new乙個例項放在那裡。採取的是空間換時間的方式,用不用都會建立,如果這樣的類多了占用記憶體空間。具體實現**如下並且附有測試**:
所謂的懶漢式顧名思義就是懶。也就是說什麼時候用什麼時候再去new要不想不到要去new,它採用的是時間換空間的方式。由於這種方式的懶我們也就它為延遲載入。具體的實現**並且附有測試**: 在上圖我們發現執行出的三個例項的hashcode值不完全一樣那麼這時就出現了執行緒安全問題。解決方法一:使用synchronized關鍵字對於getinstance()方法進行同步。修正後的**如下:
解決方法二:使用同步**塊的方式,修正**如下:package com.yang.review; /** * * @author 陽 * */ public class mysingleton /* * 使用synchronized關鍵字進行同步 */ public static synchronized mysingleton getinstance()else } return mysingleton; } }
這種方式和上一種方式是一樣的,效率都是很低的。
解決方法三:此方法和第二種差不多但是,同步的區域減小了,只對於new mysingleton(); 進行同步。
解決方法四:使用dcl(double check lock)雙檢查鎖進行執行緒安全。 **如下:
package com.yang.review; /** * * @author 陽 * */ public class mysingleton /* * 使用synchronized關鍵字進行同步 */ public static synchronized mysingleton getinstance()else } } catch (interruptedexception e) } return mysingleton; } }
這種方式的具體實現**如下:package com.yang.review; /** * * @author 陽 * */ public class mysingleton public mysingleton() public static mysingleton getinstance() public static void main(string args) }; thread thread2 = new thread() }; thread thread3 = new thread() }; thread1.start(); thread2.start(); thread3.start(); } }這種方式利用了classloader的類載入機制,而且對於內部類在沒有引用到的時候是不會載入的,這樣就實現了懶載入的模式。
設計模式之單例模式
前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...
設計模式之單例模式
package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...
設計模式之 單例模式
單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...