單例設計模式II 懶漢式

2021-06-19 06:26:24 字數 1636 閱讀 5386

單例設計模式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...