單例模式是23種設計模式中的一種建立型模式,也是最容易理解,應用最廣泛的模式之一,由於其的這些性質,也是面試中經常被問到的一種設計模式。為乙個類唯一的生成乙個物件是單例模式完成的主要工作。它的實現可以分為兩種,我們先給出餓漢模式和懶漢模式的概念,後面會逐一介紹。
顧名思義,餓漢模式就是在你的程式剛開始執行的時候就建立出單例的物件,而不是等到使用的時候才去建立它;而懶漢正好相反,它會一直拖到你需要使用該物件的時候才去建立它。那這兩種方式的利弊在哪?先來看一下單例模式的普通實現
class singleton
static singleton* a;
public:
static singleton* getsingleton()
return a;
}};singleton*singleton::a = null;
執行緒不安全:上面這種實現就是最簡單的一種單例模式的實現,那大家其實可以看出來這種實現的乙個最大的弊端就是有可能產生執行緒不安全的問題。當有兩個執行緒同時去呼叫這個getsingleton()的方法時,那麼有可能會建立出兩個物件(注意這裡必須是嚴格同步執行),這就違背了我們單例模式的初衷。如何來解決這個問題呢,第一是使用餓漢模式,因為餓漢模式是在程式剛開始執行的時候就建立這個物件,當你兩個執行緒去呼叫該物件的時候if語句條件不會成立,也就不會建立新的物件出來;第二種是實現乙個執行緒安全的單例模式。
這裡我們使用兩層判斷加乙個鎖來實現:
class singleton
static singleton* a;
public:
static singleton* getsingleton()
a.unlock();
} return a;
}};singleton*singleton::a = null;
劍指Offer第一題
在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。思路 從數值中間開始查詢,根據題意,二維陣列的左上角是最小值,二維陣列的右下角是最大值,從中間數值查詢是最節約時間的,可以從左下角或者...
劍指offer 第一題
這題思路不難,但是關於二維陣列的邊界問題,差點把我整崩潰 題目描述 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。這題的思路就是找乙個中間值,讓他在陣列查詢...
劍指offer 題2 單例模式
懶漢式 第一次呼叫時載入 1.第一版 上來沒有想很多,直接敲起,使用synchronized保證執行緒安全,如下 public class single 使用synchronized保證安全 public static synchronized single getsingle return ins...