關於單例設計模式中的雙重判斷的理解和分析

2021-07-22 15:33:05 字數 1015 閱讀 7053

之前在很多地方看到過這種單例的實現,但是對其中的兩個if判斷的作用不理解。今天就詳細的解釋一下:

class singletontwo

public static singletontwo getinstance()

} }

return instance;

} }

假設執行緒a和b作為第一批呼叫者同時或幾乎同時呼叫靜態工廠方法getinstance。

1)因為a和b是第一批呼叫者,當它們進入靜態工廠方法時,instance變數是null。因此它們幾乎同時到達 位置2。

2)  假設a執行緒先進入 synchronized (instance),到達位置3,這時由於同步機制,執行緒b無法到達位置3,只能在位置2等待。

3)執行緒a執行instance = new singletontwo()語句,使得instance引用指向乙個物件。此時執行緒b還在位置2上等待。

4)執行緒a退出synchronized (instance),返回singletontwo物件,退出靜態工廠方法。

5)執行緒b進入 synchronized (instance)塊,達到位置3,此時instance已經不為null,因此執行緒b退出synchronized (instance),

返回singletontwo物件(執行緒a所建立的singletontwo物件),退出靜態工廠方法。

到此為止,執行緒a和b得到同乙個singletontwo物件。

第乙個if判斷的作用:是為了提高程式的 效率,當singletontwo物件被建立以後,再獲取singletontwo物件時就不用去驗證同步**塊的鎖及後面的**,直接返回singletontwo物件

第二個if判斷的作用:是為了解決多執行緒下的安全性問題,也就是保證物件的唯一。如果沒有第二個if判斷,在上面介紹的步驟5處,執行緒b進入synchronized (instance)塊,不用去驗證instance是否為null,就會直接建立乙個singletontwo新物件,這樣整個程式執行下來就有可能建立多個例項。

關於單例設計模式的總結

1 什麼是單例設計模式 單例設計模式就是解決乙個類在記憶體中只有乙個物件。想要保證物件唯一 1 為了避免其他程式過多的建立該類物件,選控制其他程式建立該類物件 2 為了讓其他程式可以訪問到該類物件,只好在本類中自定義乙個物件 3 為了方便其他程式對自定義物件訪問,可以對外提供一些訪問方式 2 單例設...

關於單例設計模式的淺顯理解

首先,讓我們先來看看下面的乙個單例模式 public class singleton public synchronized static singleton getinstance 由於本類的構造方法是私有的,因此其他類無法通過new singleton 來建立本類的乙個例項,但本類提供了乙個公有...

關於單例模式的心結

今天重構公司的 看到有乙個單例的物件,在整個系統中到處都存在呼叫它的身影,因為我們這個專案會在應用伺服器 server 第一次啟動的時候載入資料庫中的 表 為什麼要先載入,因為這個專案採用的是c s模式,利用remoting進行通訊,在客戶端啟動的時候會多次獲取 表中的不同資料。複製 1 publi...