設計模式之單例模式

2021-08-21 20:41:01 字數 1879 閱讀 8597

之前淺顯的了解單例模式,只知其果不知其因,被面試官瘋狂教做人,決定重寫這篇文章,之前寫的實在是簡單了,寄希望於下次面試能夠在設計模式秀一波。

首先單例模式是如何實現單例的,這是十分重要的,那就是建構函式私有化,這個操作十分巧妙,使得外部無法建立該物件,保證了單例的這個「單」字,即只有乙個例項。其他物件只能通過單例物件的公共方法獲得單例物件的例項。

public

class main

public

static

void

main(string args)

}執行結果:

main 建構函式

public

class test3

}

在了解了單例模式的含義後,我們再來看單例模式的幾種寫法。

單例模式

應用場景:有些物件只需要乙個就足夠了

作用:整個應用程式的某個例項有且只有乙個

型別:餓漢模式、懶漢模式、執行緒安全的懶漢模式、雙鎖校驗模式

特點:

public

class singleton

//2.建立類的唯一例項

static

private singleton instance=new singleton();

//3.提供獲取例項方法

public

static singleton getinstance()

}

特點:

public

class singleton

//2.宣告類的唯一例項

static

private singleton instance;

//3.提供獲取例項的方法

public

static singleton getinstance()

return instance;

}}

public

class singleton

//2.宣告類的唯一例項

static

private singleton instance;

//3.提供獲取例項的方法

public

static synchronized singleton getinstance()

return instance;

}}

public

class singleton

public

static singleton getuniqueinstance() }}

return uniqueinstance;

}}

我們需要關注的重點有兩個:

此模式是為了解決執行緒安全問題,那麼我們將視多執行緒為常態,我們假設只有只有一次判斷為空,那麼可能會有兩個執行緒同時進入if語句中,這兩個執行緒都會建立例項,只不過乙個先建立乙個後建立。所以需要再一次判斷

if (uniqueinstance == null) 

}

大家都知道jmm有乙個指令重排序的概念,而uniqueinstance = new singleton()這個語句並不具有原子性,分為

- 為 uniqueinstance 分配記憶體空間

- 初始化 uniqueinstance

- 將 uniqueinstance 指向分配的記憶體位址

一旦第三步指令重排序到前面,那麼得到的物件可能會是個空物件,而volatile修飾的變數具有禁止指令重排序的功能,所以避免了這種情況。

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會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...