單例模式(含執行緒鎖關鍵字)

2022-02-04 16:50:31 字數 1127 閱讀 1649

單例就是只有乙個例子,只有乙個物件,不允許別人再建立物件。

餓漢式(初始化即建立物件)

class

single

public

static

single getinstance()

}

懶漢式(方法被呼叫時,才建立物件,也叫做物件的延時載入)

class

single

public

static single getinstance()

}

懶漢式看似省空間,卻有可能在多執行緒時出問題。

舉個只有兩個執行緒的例子:執行緒a被單核cpu執行到①,單核cpu切入執行緒b去執行①,仍然會通過判斷,此時a,b都會執行語句②。

改進後的安全懶漢式(低效,在方法上增加了執行緒鎖):

class

single

public

synchronized

static single getinstance()

}

tips:

執行緒鎖就是synchronized後邊的引數,漢語版的api中作者稱之為物件監視器。執行緒鎖有兩個狀態,乙個鎖住乙個開啟,開啟的時候執行緒就能進去,關閉的時候,執行緒就會在門前等待,直到鎖開啟才會進去。 

synchronized相當於乙個標示符表示它所跟隨的大括號內的內容是同步**塊,執行這部分**塊就要判斷執行緒鎖的狀態。

再次改進後最終的懶漢式(在方法內部增加執行緒鎖)

class

single

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...