劍指offer 面試題2 實現單例模式

2021-07-26 22:00:02 字數 1924 閱讀 2922

終於把簡直offer看完了一遍

所以第二遍我決定要美乙個題自己去實現一遍,會加入自己的理解(但是不一定對哈)

package t2singleton;

/** * 餓漢式

*@author yxx

* */

public

class

singleton

private

static singleton singleton = new singleton();

public

static singleton getinstance()

}

我第一下想到的就是餓漢試的單例模式,因為他可以在多執行緒下使用,不想一般的懶漢式那樣。

餓漢式在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不再改變,所以是執行緒安全的。

如果是懶漢式,我們就得加同步鎖了

package t2singleton;

/** * 多執行緒

* *@author yxx

* */

public

class

singleton2

private

static singleton2 instance = null;

public

synchronized

static singleton2 getinstance()

return instance;

}}

package t2singleton;

/** * 多執行緒

* *@author yxx

* */

public

class

singleton2

private

static singleton2 instance = null;

public

static singleton2 getinstance() }}

return instance;

}}

上面這種,加同步鎖前後兩次判斷例項是否存在

加鎖耗時。可以實現只有當single為null即沒有建立時,需要加鎖操作,當single建立出來之後,則無須加鎖。

package t2singleton;

/** * 按需建立

* *@author yxx

* */

public

class

singleton3

public

static singleton3 getinstance()

static class nested

final

static singleton3 instance = new singleton3();

}}

如果當我們第一次試圖通過屬性single3.instance得到single3的例項時,會自動呼叫nested的靜態建構函式建立例項instance。如果我們不呼叫屬性,那麼就不會觸發執行,也不會建立例項。

這兩種乍看上去非常相似,其實是有區別的,主要兩點

餓漢式是執行緒安全的,可以直接用於多執行緒而不會出現問題,懶漢式就不行,它是執行緒不安全的,如果用於多執行緒可能會被例項化多次,失去單例的作用。

如果要把懶漢式用於多執行緒,有兩種方式保證安全性,一種是在getinstance方法上加同步,另一種是在使用該單例方法前後加雙鎖。

餓漢式在類建立的同時就例項化乙個靜態物件出來,不管之後會不會使用這個單例,會佔據一定的記憶體,相應的在呼叫時速度也會更快,

而懶漢式顧名思義,會延遲載入,在第一次使用該單例的時候才會例項化物件出來,第一次掉用時要初始化,如果要做的工作比較多,效能上會有些延遲,之後就和餓漢式一樣了。

劍指offer 面試題2 實現單例模式

版本1 餓漢式,在一開始就建立好例項 建構函式私有,使用靜態區域性變數,缺點只能在c 11以上環境中執行 class singleton static singleton getinstance private singleton 或者 class singleton static singleto...

劍指offer面試題2(單例設計模式)

單例設計模式屬於建立設計模式,是設計模式中很常用的一種。確保某個類中只有乙個例項,並且自行例項化並向整個系統提供這個例項。確保某個類有且僅有乙個例項,避免產生多個物件消耗過多的資源,或者某種型別的物件有且僅有乙個。構造方法不對外公開,一般用private修飾。通過乙個靜態方法返回單例類的例項。確保單...

劍指offer 面試題2

單例模式是面試經常會提及的題目 那麼什麼是單例模式?怎麼實現單例模式?以上問題是本節的核心 首先,單例模式是指乙個類只能定義乙個物件,或者說乙個類只能擁有乙個物件。其次,怎麼實現單例模式,通過將建構函式宣告為private,利用static 引數的特性作為標識進行判斷。如下 include usin...