單例模式,設計模式中最常用也是最簡單的一種的設計模式。設計模式的作用或者說使用場合想必大家都知道,主要用在實際應用只需要例項化一次的場合,網上的例子也很多,什麼印表機的例子等等。我在專案中也是用過單例模式,當時是由於專案需要,需要在應用中動態配置資料庫連線池,而這種資料庫連線池的配置就只需要在單例模式下進行配置。接下來和大家一起學習總結一下簡單的單例模式以及在併發情況下,單例模式是如何保持執行緒安全的。
餓漢式單例模式是一開始就直接例項化物件,因此這種方式在併發情況當然是安全的。
package test.singleton;
/** *
*@author 愛琴孩
* 餓漢式單例模式
*/public
class
thristysingletondemo
public
static thristysingletondemo getsingletoninstance()
}
下面開啟多個執行緒來測試餓漢式單例模式的執行緒安全問題
package test.singleton;
/**
*@author 愛琴孩
可以看到,餓漢模式的單例模式是執行緒安全的。
package test.singleton;
/**
*@author 愛琴孩
* 懶漢式單例模式
*/public
class
lazysingletondemo
public
static lazysingletondemo getinstance() catch (interruptedexception e)
singletondemo =new lazysingletondemo();
}return singletondemo;}}
開啟多個執行緒來測試懶漢式單例模式的執行緒安全問題,**如下
package test.singleton;
/** *@author 愛琴孩
*/public
class
threaddemo
extends
thread
public
static
void
main(string args)
for(int j=0;j<10;j++)}}
測試結果如下,顯然,單例模式的效果並沒有實現
那麼出現這種情況,該怎麼解決??大家肯定會想到用synchronized來加鎖不就行了嘛,是的加鎖確實能解決這個問題,但是加鎖也是有竅門的,如何加,加在**,效率最好??
有的小夥伴可能是直接就在方法上加鎖,**如下
package test.singleton;
/** *@author 愛琴孩
*用synchronized來確保執行緒安全的單例模式
*/public
class
safelazysingletondemo
public
static
synchronized safelazysingletondemo getsingletonintance() catch (interruptedexception e)
safelazysingletondemo=new safelazysingletondemo();
}
return safelazysingletondemo;}}
開啟執行緒測試單例模式和上面的一樣,就直接看測試結果
顯然,在方法上直接加synchronized 關鍵字是可以的,但是大家都知道,同步是比較耗費效能的,同步方法和同步關鍵**塊的選擇,相比大家都知道該選哪乙個。
具體**如下
package test.singleton;
/** *@author 愛琴孩
* 雙重檢查鎖實現單例模式
這種同步關鍵**的形式的單例模式肯定是要比直接同步方法的效果要好的。
單例模式雖然簡單,加鎖也沒什麼難點,但是要在加鎖的同時考慮效率,公司的前輩說這種雙檢查加鎖的方式,在版本比較老的jdk版本上可能不適用,而且對於併發單例模式的寫法有很多,像列舉單例模式等等。。後面會繼續學習總結。
參考文件 [[
iOS開發 單例設計模式
一 什麼是單例 單例 在記憶體中只有唯一的例項,並且提供乙個全域性的訪問方法!單例的好處 可以實現同乙份資源共享。二 單例設計 非全部封死,提供兩個建立物件的方式 1 可以選擇使用類方法,直接建立乙個單例物件 2 也可以選擇使用其他方式,如alloc init方式,建立非單例物件 在單例類的.m檔案...
IOS開發 單例模式安全寫法
一般情況我們都是這麼寫 static mysingleton sharesingleton instancetype sharedsingleton static dispatch once oncetoken dispatch once oncetoken,sharesingleton mysin...
iOS開發單例模式的簡單實用
單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。目前具有執行緒安全的兩種單例寫法 第一種 i...