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