package
singleton;
/**
* @author lei
* 單例模式的五種寫法:
* 1、懶漢
* 2、惡漢
* 3、靜態(tài)內(nèi)部類
* 4、枚舉
* 5、雙重校驗(yàn)鎖
* 2011-9-6
*/
/**
*五、 雙重校驗(yàn)鎖,在當(dāng)前的內(nèi)存模型中無效
*/
class
LockSingleton{
private
volatile
static
LockSingleton singleton;
private
LockSingleton(){}
//詳見:http://www.ibm.com/developerworks/cn/java/j-dcl.html
public
static
LockSingleton getInstance(){
if
(singleton==
null
){
synchronized
(LockSingleton.
class
){
if
(singleton==
null
){
singleton=
new
LockSingleton();
}
}
}
return
singleton;
}
}
/**
* 四、枚舉,《Effective Java》作者推薦使用的方法,優(yōu)點(diǎn):不僅能避免多線程同步問題,而且還能防止反序列化重新創(chuàng)建新的對象
*/
enum
EnumSingleton{
INSTANCE;
public
void
doSomeThing(){
}
}
/**
* 三、靜態(tài)內(nèi)部類 優(yōu)點(diǎn):加載時(shí)不會(huì)初始化靜態(tài)變量INSTANCE,因?yàn)闆]有主動(dòng)使用,達(dá)到Lazy loading
*/
class
InternalSingleton{
private
static
class
SingletonHolder{
private
final
static
InternalSingleton INSTANCE=
new
InternalSingleton();
}
private
InternalSingleton(){}
public
static
InternalSingleton getInstance(){
return
SingletonHolder.INSTANCE;
}
}
/**
* 二、惡漢,缺點(diǎn):沒有達(dá)到lazy loading的效果
*/
class
HungrySingleton{
private
static
HungrySingleton singleton=
new
HungrySingleton();
private
HungrySingleton(){}
public
static
HungrySingleton getInstance(){
return
singleton;
}
}
/**
* 一、懶漢,常用的寫法
*/
class
LazySingleton{
private
static
LazySingleton singleton;
private
LazySingleton(){
}
public
static
LazySingleton getInstance(){
if
(singleton==
null
){
singleton=
new
LazySingleton();
}
return
singleton;
}
}