Singleton模式及常見問題

2021-08-23 11:54:51 字數 1604 閱讀 6854

1. singleton模式介紹:

singleton模式也成為單件模式,即確保乙個類只有乙個例項,並提供乙個全域性的訪問點.

類圖:singleton

static instance

//其他有用的單件資料

static getinstance()

//其他有用的單件方法

2. singleton模式的實現:

public class singletonmethod

public static singletonmethod getinstance()

return instance;

}/**

* @param args

*/public static void main(string args)

}實現的說明;構造器是私有的,保證不能被外部類所直接建立.在通過getinstance()來呼叫時,判斷例項是否已經建立,如果沒有建立再進行建立.通過測試我們驗證了建立2次出的例項確實時乙個.真的很簡單.那我們還是來看看下面的注意事項吧!

3. singleton模式的注意事項

上面的實現好像很好,不過上面的做法卻不能保障我們每次取到的例項就是乙個,那麼是什麼時候呢?讓我們來看看.當我們程式中使用了多執行緒的時候,確實有建立了兩個不同例項的時候,究竟是為什麼呢?研究發現,其實有時候會有兩個執行緒同時去訪問getinstance(),發現instance為null,那麼他們都會去建立這個例項並返回,這樣就會產生兩個例項了.哈哈,問題找到了,我們要怎麼來修改呢?

首先我們想到的是,多執行緒併發時我們可以使用synchronized的,我們這樣來修改一下:

public static synchronized singletonmethod2 getinstance()

return instance;

}問題得到解決了,可以仔細考慮時我們發現,還有乙個比較嚴重的問題,只有第一次執行此方法才需要同步,那麼我們每次都來同步它,一定會降低效率的.如果您能接收這樣的處理負擔,那麼這樣的方法還是很好的,簡單有效.

那麼有辦法改善多執行緒嘛?參見以下處理方法:

1. 使用」急切」建立例項,二不用延遲例項化的做法

public class singletontest

private static singletontest instance = new singletontest();

public static singletontest getinstance()

public static void main(string args)

}2. 使用」雙重加鎖」的辦法

private volatile static singletonmethod2 instance = null;

public static singletonmethod2 getinstance() }}

return instance;

}volatile 關鍵字確保,當instance變數被初始化為singleton例項時,多個執行緒能正確地處理instance變數.

注:雙重加鎖不適用於1.4及更早的jdk.

總結一些吧:其實大多數人都了解singleton模式,在使用的過程中也都用過,不過你們注意了這些可能的問題了嘛?

ASIHTTPRequest配置及常見問題

第一步,新增asihttprequest相關檔案到xcode專案中,所需檔案列表如下 reachability.h 在原始碼的 external reachability 目錄下 reachability.m 在原始碼的 external reachability 目錄下 第二步,鏈結相關類庫,所需...

設計模式 singleton模式

使用單件模式的意圖是保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點。將單件定義為全域性或靜態物件,然後依賴於自動的初始化,並不能完全實現上述意圖。雖然可以提供全域性訪問點,但這是不夠的。原因如下 1 我們不能保證靜態物件只有乙個例項會被宣告。2 我們可能沒有足夠資訊在靜態初始化時例項化每個單...

設計模式 Singleton模式

當我們想在程式中表示某個東西只會存在乙個時,就會有 只能建立乙個例項 的需求。典型的例子有表示程式所執行的那台計算機的類,表示軟體系統相關設定的類,以及表示視窗 window system 的類。singleton類只會生成乙個例項。singleton類定義了static欄位singleton,並將...