Android 單例模式多種實現方法對比

2021-10-12 20:30:48 字數 1890 閱讀 2528

單例模式,又稱單件模式或者單子模式,指的是乙個類只有乙個例項,並且提供乙個全域性訪問點。

可以使用下面幾種方式建立單例呼叫:

餓漢式

餓漢式指的是單例的例項在類裝載時進行建立。如果單例類的構造方法中沒有包含過多的操作處理,餓漢式其實是可以接受的。

餓漢式的常見**如下,當singleinstance類載入時會執行private static singleinstance sinstance = new singleinstance();初始化了唯一的例項,然後getinstance()直接返回sinstance即可。

public

class

singleinstance

public

static singleinstance getinstance()

}

如果構造方法中存在過多的處理,會導致載入這個類時比較慢,可能引起效能問題。如果使用餓漢式的話,只進行了類的裝載,並沒有實質的呼叫,會造成資源的浪費。

懶漢式

懶漢式指的是單例例項在第一次使用時進行建立。這種情況下避免了上面餓漢式可能遇到的問題。但是考慮到多執行緒的併發操作,我們不能簡簡單單得像下面**實現。

public

class

singleinstance

public

static singleinstance getinstance()

return sinstance;

}}

在多個執行緒密集呼叫getinstance()時,有同步問題,可能會建立多個例項。比如執行緒a進入null == sinstance這段**塊,而在a執行緒未建立完成例項時,如果執行緒b也進入了該**塊,這時sinstance還是null,必然會造成兩個例項的產生。

使用synchrnozed修飾符

使用synchrnozed修飾符修飾getinstance()方法可以保證多執行緒保證單例唯一性的方法。 synchronized修飾的方法後,當某個執行緒進入呼叫這個方法,該執行緒只有當其他執行緒離開當前方法後才會進入該方法。所以可以保證getinstance()在任何時候只有乙個執行緒進入。

public

class

singleinstance

public

static

synchronized singleinstance getinstance()

return sinstance;

}}

但是使用synchronized修飾getinstance()方法後必然會導致效能下降,而且getinstance()是乙個被頻繁呼叫的方法。

雙重檢查加鎖

使用雙重檢查加鎖,首先進入該方法時進行null == sinstance檢查,如果第一次檢查通過,即沒有例項建立,則進入synchronized控制的同步塊,並再次檢查例項是否建立,如果仍未建立,則建立該例項。

雙重檢查加鎖保證了多執行緒下只建立乙個例項,並且加鎖**塊只在例項建立的之前進行同步。如果例項已經建立後,進入該方法,則不會執行到同步塊的**。

public

class

singleinstance

public

static singleinstance getinstance()

}}return sinstance;

}}

volatile是輕量級的synchronized,它在多處理器開發中保證了共享變數的「可見性」。可見性的意思是當乙個執行緒修改乙個共享變數 時,另外乙個執行緒能讀到這個修改的值。使用volatile修飾sinstance變數之後,可以確保多個執行緒之間正確處理sinstance變數。

單例設計模式多種實現方式

public class singleton 私有化建構函式,防止new物件 public static singleton getinstance public class singleton public static singleton getinstance return intance 這...

17 單例模式 原來單例模式有這麼多種實現

單例模式 singleton 保證乙個類只有乙個例項,並保證只有唯一的訪問點。uml圖 懶漢式 單執行緒 class singleton1 public static singleton1 getinstance return instance 懶漢式 支援併發,同步方法,但效能低 無論instan...

C 單例模式的多種簡單實現

這裡我就不做過多的解釋了,畢竟關於singleton的資料實在是太多太多了。點選這裡 1.簡單的思路就是,建立物件單例的動作轉移到另外的行為上面,利用乙個行為去建立物件自身,如下 public class singleton private static singleton singleton nu...