滴滴面試官 如何實現乙個執行緒安全的單例模式

2021-10-24 15:42:32 字數 1968 閱讀 2077

單例模式作為最常見的設計模式,有很多實現方式,今天介紹一下單例模式相關的內容。

從字面上理解,單例模式需要確保乙個類只有乙個物件。比如執行緒池、快取、日誌物件、印表機驅動物件、顯示卡驅動物件等,這些類的物件往往只需要乙個例項就可以。如果乙個類的物件需要被頻繁建立,那麼也會需要頻繁gc,單例模式就可以解決這樣的問題。

單例模式的實現方式非常多,但總體上可以分為兩類:餓漢式和懶漢式。餓漢式是在類載入過程中就建立物件的方式,而懶漢式是需要使用時才會去建立物件的方式,這兩種方式各有特點。餓漢式存在的問題是如果要建立的物件占用的空間非常大,且使用頻率非常低,那麼這種方式是非常不划算的。而懶漢式有可能會遇到併發問題,這就要求我們需要考慮對建立物件的過程進行加鎖。不管是餓漢式還是懶漢式,建立的物件一般都得使用static關鍵字進行修飾。

public

class

singleton

public

static singleton getinstance()

}

上面的餓漢式單例在類載入時建立了乙個物件,然後建立了乙個private修飾的構造方法防止通過構造方法建立物件。

public

class

singleton

public

static singleton getinstance()

return instance;

}}

上面這種單例方式的建立我們可以很容易看出當需要使用這個物件時才會去建立,滿足懶漢式的要求。但是這種建立單例的方式是有缺陷的,當多個執行緒同時獲取物件,在判斷物件是否為空的地方,如果兩個執行緒同時到達,那麼就會同時進入這個條件中,建立多個物件。下面提出一些執行緒安全的懶漢式單例。

public

class

singleton

public

static

synchronized singleton getinstance()

return instance;

}}

基於上面的非執行緒安全版本,我們在getinstance()方法上加上了synchronized鎖,就變成了執行緒安全的版本。但是這種直接在方法上加鎖的方式其實對併發的效率影響是很大的,儘管在jdk6中對synchronized做了很大優化,但是仍然不能滿足我們對高併發的要求,下面介紹一下更加高效的雙重校驗鎖版。

public

class

singleton

public

static singleton getinstance()

}}return instance;

}}

我們又基於前面的非執行緒安全的版本實現了這個雙重校驗鎖版的懶漢式單例,如果多個執行緒同時在外層判斷物件為空時,開始搶占鎖資源,搶到的執行緒建立物件,其他執行緒就不再需要建立執行緒了。這種方式的優點在於只有第一次搶奪資源的時候需要進行同步,後續的併發都會判斷物件不為空,直接返回物件。

public

class

singleton

private

singleton()

public

static singleton getinstance()

}

該方式依然是懶漢式單例,只不過利用靜態內部類實現,同樣也是執行緒安全的。

public

class

enumsingleton

public

static enumsingleton getinstance()

private

enum singleton

public enumsingleton getinstance()

}}

上面是利用列舉建立單例物件的方法,利用列舉類載入時會例項化構造方法的特點進行單例模式的實現,是一種比較推薦使用的方法。

面試官 如何控制多執行緒執行順序?

先看如下 public class test static thread thread2 newthread static thread thread3 newthread public static void main string args throws interruptedexception...

乙個前端菜鳥面試官的體會

因為工作專案需要,上週急聘一位前端開發人員。老闆的要求是,基礎要紮實,移動端有開發經驗,能快速上手,這就可以了 來面試的那些人怎麼說呢,簡歷基本都是高大上 相信老闆初篩簡歷的時候也是稍微用心了 都是豐富的pc 移動端開發經驗,簡歷裡面的技術特長 工作經歷 專案經歷加起來基本沒有少於3頁紙的。然而,他...

C 用兩個棧實現乙個佇列(面試官的小結)

前言 兩年前從網上看到一道面試題 用兩個棧 stack 實現乙個佇列 queue 覺得不錯,就經常拿來面試,幾年下來,做此題的應該有幾十人了。通過對面試者的表現和反應,有一些統計和感受,在此做個小結。用c 描述,題目大致是這樣的 已知下面stack類及其3個方法push pop和 count,請用2...