單例設計模式i (餓漢式)在開發中比較常見。而另一種寫法,即懶漢式主要用於面試考試。
但因為感覺比較有趣,所以單獨列出做個記錄。
懶漢式:物件延遲載入。
思路:類存在時內部沒有物件,只有當呼叫方法時才會在類中建立物件(比喻相當形象啊……到底是有多懶= =|||)。
特點:物件延遲載入;
容易存在安全隱患;
先來最終解決方案的看**:
class single
public static single getinstance()
} } return s;
}}
—————————————————(我是現在很餓的分割線)——————————————————
然後這個是基本懶漢式的**:
class single
public static single getinstance()
}
主要問題出在 getinstance( ) 方法中;
因為cpu的乙個核心在同一時刻只能處理乙個任務,為了高效處理多個任務,它會在極小的時間單位裡隨機進行不同任務的之間的切換。
現在假設程式a呼叫了 getinstance( ) 方法,並執行到了這條語句:
if(s== null)
此刻cpu卻切換到了其他任務,於是程式a就掛在了此處。
於此同時,程式b也呼叫了 getinstance( ) 方法,進入並執行了語句:
if(s== null)
s= new single();
因為此前程式a在建立物件之前由於cpu切換而掛停,所以此時程式b判斷 s 的值為空是成立的,因此可以創立物件。
接著,cpu切換回來,程式a繼續讀下面的語句,注意此處a已經判斷過 s 的值為空,所以依然可以創立物件。
於此,物件在類中的唯一性就已經被打破了。
解決方案為同步鎖(其實並沒有學到這裡,只是老師單獨講解了一下並提到了這個,名稱也許不正式)
public static single synchronized getinstance()
在方法前加上同步鎖 synchronized 可以使呼叫者在進入前進行判斷,如果該方法沒有人呼叫,就進入。否則不呼叫。
這樣基本解決了物件在類中的唯一性問題,但卻託慢了**的執行效率。
因為每次呼叫前都會對同步鎖進行判斷,多次呼叫多次判斷十分低效。
優化思想為雙重判斷,**如下:
public static single getinstance()
} } return s;
}
重新使用上面的例子:
首先程式a呼叫 getinstance( ) 方法,判斷 s 值為空,進入然後對鎖進行判斷,鎖內沒有程式,進入。
如果此時cpu進行了切換導致程式a掛停,當程式 b 呼叫方法時,再進行判斷同步鎖時,則發現鎖內有程式進入,即停止呼叫。
如果鎖告知內部沒有程式,即直接進入進行物件建立。
於此,不需要每次呼叫 getinstance( ) 方法時都判斷一次同步鎖,提高了**的執行效率。
懶漢式單例設計模式
懶漢式單例設計模式 特點 什麼時候用,什麼時候開闢空間.缺點 多執行緒模式下,會出現問題,達不到單例模式的效果 步驟 1.構造方法私有化 2.定義乙個私有的.靜態的.類的成員變數,但不為其賦初始值 設定初始值為null 3.提供乙個名稱為getinstance 的公共的.靜態的方法,在方法中先判斷步...
單例設計模式(懶漢式)
版本 v1.0 public class study 6 10 物件是方法被呼叫時,才初始化,也叫做物件的延時載入。稱為 懶漢式 single類進記憶體,物件還沒有存在,只有呼叫了getinstance方法時,才建立物件 開發一般用餓漢式 如果乙個人呼叫方法沒有問題,如果多個人一起呼叫就會出問題,就...
設計模式 單例模式 餓漢式單例和懶漢式單例
單例模式 singleton pattern 乙個在設計模式中比較簡單的模式,我們常說的餓漢式和懶漢式是最常舉例的兩種寫法。如下餓漢式 public class singleton 獲取例項物件 public static singleton getsingleton 懶漢式 public clas...