單例就是只有乙個例子,只有乙個物件,不允許別人再建立物件。
餓漢式(初始化即建立物件)
classsingle
public
static
single getinstance()
}
懶漢式(方法被呼叫時,才建立物件,也叫做物件的延時載入)
classsingle
public
static single getinstance()
}
懶漢式看似省空間,卻有可能在多執行緒時出問題。
舉個只有兩個執行緒的例子:執行緒a被單核cpu執行到①,單核cpu切入執行緒b去執行①,仍然會通過判斷,此時a,b都會執行語句②。
改進後的安全懶漢式(低效,在方法上增加了執行緒鎖):
classsingle
public
synchronized
static single getinstance()
}
tips:
執行緒鎖就是synchronized後邊的引數,漢語版的api中作者稱之為物件監視器。執行緒鎖有兩個狀態,乙個鎖住乙個開啟,開啟的時候執行緒就能進去,關閉的時候,執行緒就會在門前等待,直到鎖開啟才會進去。
synchronized相當於乙個標示符表示它所跟隨的大括號內的內容是同步**塊,執行這部分**塊就要判斷執行緒鎖的狀態。
再次改進後最終的懶漢式(在方法內部增加執行緒鎖)
classsingle
public
static
single getinstance()
}return
s; }
}
解析一下:執行緒a執行語句①通過,執行語句②通過,此時cpu切入執行緒b執行到語句①通過,執行到語句②未通過,
然後cpu切入執行緒a繼續執行,通過語句③和④並解除執行緒鎖,cpu再次切入執行緒b,此時會通過語句②,執行語句③,
如果沒有語句③又悲劇了。。。
總結,既然有這麼乙個單例類,肯定你是要用它的,你要用它一定會開闢記憶體存放它的物件,
懶漢實在是浪費時間又沒什麼實際意義,所以建議選擇餓漢式的單例模式。
單例模式(含執行緒鎖關鍵字)
單例就是只有乙個例子,只有乙個物件,不允許別人再建立物件。餓漢式 初始化即建立物件 class single public static single getinstance 懶漢式 方法被呼叫時,才建立物件,也叫做物件的延時載入 class single public static single ...
static關鍵字 單例模式
static關鍵字 靜態的 在物件建立前就載入到記憶體 用法 用在屬性和方法的前面 一,用在屬性前面 public class a 測試 a a new a i 1 j 1 a b new a i 1 j 2 二,用在方法前面 靜態的方法是在new物件之前就被載入到記憶體中了 而非靜態方法是new出...
執行緒鎖關鍵字 synchronized
static config instance nil config instance return instance id allocwithzone nszone zone returnnil 在上面兩個例子中都用到 關鍵字 synchronized,這裡大概說一下 通過 synchronized...