在我們做開發的時候,有些類的例項每次都new乙個出來是沒有必要的,因為它太占用記憶體咯。因此,單利模式有了它的用武之地了。最簡單的單利模式如下:
private static logcathelper instance = null;
public static logcathelper getinstance(context mcontext,string path)
return instance;
}
大家一看,這不很簡單嘛,沒有啥難處啊。但是,你在深入的看一下,會發現,這樣的寫法並不難保證唯一性,為啥呢?當在多執行緒執行的時候,同時進入到getinstance方法中,instance的判斷都是null,所以唯一性就不是那麼絕對了這樣寫。因此,下面這種方法很好的解決了這個問題:
public synchronized static logcathelper getinstance(context mcontext,string path)
return instance;
}
難不倒我,加個同步鎖不就搞定了。ok,上面唯一性的問題是搞定了,但是仔細的在研究一下,發現問題了,每次執行getinstance方法的時候都會受到同步鎖的影響,這樣的話,執行的效率就會大大的降低了,怎麼辦呢?那我們就只有在第一次建立的時候加個同步鎖不就完事了嗎,如下:
public static logcathelper getinstance(context mcontext,string path)
}} return instance;
}
1)a、b執行緒同事進入第乙個if語句判斷
2)a首先進入synchronized塊,由於此時instance == null,所以它就要執行instance = new logcathelper(mcontext,path)語句
3)由於jvm內部的優化機制,jvm先畫出了一些分配給logcathelper例項的空白記憶體,並賦值給instance成員(注意此時jvm沒有開始初始化這個例項),然後a離開了synchronized塊。
4>b進入synchronized塊,由於instance此時不是null,因此它馬上離開了synchronized塊並將結果返回給呼叫該方法的程式。
5>此時b執行緒打算使用logcathelper例項,卻發現它沒有被初始化,於是錯誤發生了。
通過以上的步驟分析呢,單利模式還是不是很安全的,那麼單利模式使用乙個內部類來實現怎麼樣呢?
jvm內部的機制能夠保證當乙個類被載入的時候,這個類的載入過程是執行緒互斥的。這樣當我們第一次呼叫getinstance的時候,jvm能夠幫我們保證instance只被建立一次,並且會保證把賦值給instance的記憶體初始化完畢,這樣我們就不用擔心上面的問題。同時該方法也只會在第一次呼叫的時候使用互斥機制,這樣就解決了低效能問題。這樣我們暫時總結乙個完美的單例模式:
private static class singlefactory
public static logcathelper getinstance()
說它完美吧,也不一定是完美的,如果在建構函式中拋了異常之後,就會永遠建立不了例項了。當然了,單利模式具體用到的時候,根據場景選擇不同方法就好了,完美的事物是不存在的,那就選個最優的就好了。
java設計模式 單利模式
單利模式 確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項,這個類稱為單例類,它提供全 局訪問的方法。單例模式是一種物件建立型模式。三個要點 1 單例類只能有乙個例項。2 單例類必須自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。使用方法 在單例類的內部實現只生成乙...
Java設計模式 單利模式
設計模式 是一套被反覆使用,多數人知曉,經過分類編碼目的,設計經驗的總結。目的 使用設計模式是為了提高 重用性,讓 更容易讓人理解,並保證 的可靠性。單利模式 顧名思義就是只能有乙個例項,不能再出現第二個,就如同地球上沒有兩片一模一樣的樹葉一樣。在此處即,乙個類只能有乙個實力,且整個專案都能訪問該例...
設計模式之單利模式
什麼是單例模式?顧名思義,單例模式,就是對應類自始至終就只有一 例項物件。因為其建構函式私有化,所以不能再類外建立物件。利用靜態成員方法通過類的公有來訪問類的私有方法,從而達到構造乙個例項物件。建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static...