單例模式的幾種實現方式

2021-10-13 07:35:37 字數 1864 閱讀 6428

public

class

person

/* private person person = new person();

出現stackoverflowerror錯誤 因為建立物件需要呼叫構造方法執行

構造方法執行在棧記憶體中 每次建立物件需要載入屬性 該屬性又是當前類物件

造成無限迴圈建立物件 最終棧記憶體壓滿 不釋放

棧記憶體的空間比堆記憶體要小 所以棧記憶體先堆滿

因此需要加static修飾符 static修飾的元素屬於類 只載入一次

*///final 修飾的屬性基本型別是值不能改變 引用型別是位址不能改變 防止使用者拿到物件 將物件置為null

//私有的當前類物件作為屬性

private

static

final person person =

newperson()

;// 公有的方法 用來獲取該類物件

/* static 調該方法的兩種方式

1)類名點(方法需要static修飾)

2)物件點(該方法用來獲取當前類物件 此時還沒有物件)

*/public

static person getperson()

}

public

class

person

/* valatile 修飾屬性 有以下幾個特點:

1. 屬性在某乙個執行緒操作的時候 屬性是鎖定的 其他的執行緒沒法獲取屬性

2. 屬性被某乙個執行緒修改後 另外的執行緒立即可見

3. 可以禁止指令重新排布

當被volatile修飾後 堆必須先分配乙個物件記憶體 必須再將物件記憶體的位址交給棧引用 最後往物件空間中擺放東西

沒有volatile修飾時 可能會產生擺放東西時又來了乙個物件 而此時並沒有將位址引用交給棧

*/private

static

volatile person person;

// 公有靜態方法 獲取該類物件

public

static person getperson()

}}return person;

}}

自由序列化、執行緒安全(列舉本身是執行緒安全的)

public

enum person

}

public

class

person

private

static

final person person;

static

public

static person getinstance()

}

public

class

person

private

static

class

holder

public

static person getinstance()

}

public

class

test

}class

aprivate p p2 =

newp

("a類屬性p3");

static

public

static

class

cprivate p p3 =

newp

("內部類屬性p3");

static}}

class

p}

單例模式實現的幾種方式

單例模式三個主要特點 1 構造方法私有化 2 例項化的變數引用私有化 3 獲取例項的方法共有。package com.ctl.singleton 懶漢式單例 該模式的特點是類載入時沒有生成單例,只有當第一次呼叫 getlnstance 方法時才去建立這個單例 注意 如果編寫的是多執行緒程式,則不要刪...

單例模式的幾種實現方式

單例模式莫過於是我們最常用的設計模式之一了,它的優缺點就是 優也單例,缺也單例 當然應用它方面優點還是較多些的,所以下面我們看看,常用的幾種實現方式有哪些吧。這種是最基本的實現方式,最大的問題就是不支援多執行緒,由於沒有加鎖,嚴格上並不算單例模式。public class singleton pub...

單例模式的幾種實現方式

實現方式大致分為兩種 懶漢模式 在第一次使用該物件時,才會初始化例項,以免了資源的浪費,同時,需要考慮的是執行緒安全問題。餓漢模式 在類初始化時就需要建立乙個例項物件出來,當時並不一定會使用該物件,可能會造成資源的浪費,好處是不用考慮安全問題。下面看下幾種常見的實現方式 首先看懶漢模式 1 執行緒非...