多執行緒環境下實現單例模式

2021-09-17 18:22:43 字數 3177 閱讀 6593

(1) 餓漢式:就是在使用類時就將物件建立完畢

例項:

public

class

myobject

public

static myobject getinstance()

}//測試

public

static

void

main

(string[

] args)

結果:可見hashcode的值一樣的。所有相同物件

(2) 懶漢式(延遲載入):就是物件在呼叫getinstance()方法時才被建立

例項:

public

class

myobject2

public

static myobject2 getinstance()

return instance;}}

//測試

public

static

void

main

(string[

] args)

上面介紹了單執行緒下單例模式的實現,但是在多執行緒環境下,懶漢式單例模式會出現問題。

如:

public

class

myobject2

public

static myobject2 getinstance()

}catch

(interruptedexception e)

return instance;}}

//執行緒

public

class

mythread

extends

thread

}//測試

public

static

void

main

(string[

] args)

結果:出現了不一樣的物件。原因是:當第乙個執行緒進入if時,為null,停了一會,此時第二個執行緒來了,物件還沒有被new出來,此時還是為空。又進入if了,再次呼叫new所有建立了不同的物件。同理第三個執行緒也是如此。所有看到了三個不同的物件。

在getinstance()方法上新增同步關鍵字,其他不變

synchronized

public

static myobject2 getinstance()

}catch

(interruptedexception e)

return instance;

}

結果:但是這種同步的方式,只有當乙個執行緒執行完了,另乙個執行緒才能執行,有點影響效能。

更改**:

public

static myobject3 getinstance()

}}catch

(interruptedexception e)

return instance;

}

例項:

public

class

myobject

public

static myobject getinstance()

}}return myobject;

}}

結果:這個方式實現了付出一次同步開銷就可以實現單列。

此方式與餓漢式差不多

public

class

myobject

private

myobject()

public

static myobject getinstance()

}

例項:

public

class

myobject

implements

serializable

private

myobject()

public

static myobject getinstance()

//一定要寫這個方法

protected object readresolve()

throws objectstreamexception

}//測試

public

class

test

catch

(filenotfoundexception e)

catch

(ioexception e)

trycatch

(filenotfoundexception e)

catch

(ioexception e)

catch

(classnotfoundexception e)

}}

public

class

myobject

public myobject getobject()

}public

static myobject getinstance()

}//執行緒

public

class

mythread

extends

thread

}

例項:更改myobject4 **

public

class

myobject4

private

myobject4()

public

static myobject4 getinstance()

}

多執行緒下的單例模式

單例模式分為兩種 懶漢單例模式和餓漢式單例模式 public class singleton private static singleton single null public static singleton getinstance return single 在單執行緒中,這樣寫,不會存在任...

多執行緒下的單例模式

在多執行緒下的singleton模式是有弊端的,但如何解決呢?辦法是使用lock機制。今天研究的lock機制,並且順便了解了些關於多執行緒的cpu層面的機制。在單個cpu的環境下,在系統的某一時間下cpu只能做一件事情,乙個時間片 slice 這個是cpu執行最小單位。在系統中有多個程序看起來好像是...

c 多執行緒單例模式 C 單例模式實現

單例模式,可以說設計模式中最常應用的一種模式了。但是如果沒有學過設計模式的人,可能不會想到要去應用單例模式,面對單例模式適用的情況,可能會優先考慮使用全域性或者靜態變數的方式,這樣比較簡單,也是沒學過設計模式的人所能想到的最簡單的方式了。一般情況下,我們建立的一些類是屬於工具性質的,基本不用儲存太多...