您的位置:首页 > 其它

饿汉式和懒汉式

2014-08-29 19:36 99 查看
上一篇博文写了个简单的单例模式,那是用饿汉式实现的,其实,实现单例模式可以通过两种方式,一个是饿汉式,另外一个是懒汉式。

先回顾一下饿汉式单例的写法:

//饿汉式

class Single {

private int age;

public void setAge(int age){

this.age=age;

}

public int getAge(){

return age;

}

//自定义构造方法

private Single(){

}

//自定义一个对象

static Single s=new Single();

public static Single getInstance(){

return s;

}

}

饿汉式:先初始化对象。

那么,我们来看看懒汉式的实现方式

//懒汉式

class Single{

private int age;

public void setAge(int age){

this.age=age;

}

public int getAge(){

return age;

}

//自定义构造方法

private Single(){

}

//自定义一个对象

static Single s=null;

public static Single getInstance(){

if(s==null){

s=new Single();

}

return s;

}

}

看到红色区域代码的区别了么?

懒汉式:对象是方法被调用时才初始化,也叫做对象的延迟加载。

在实际开发中一般用饿汉式,原因:

1.饿汉式代码简单方便,不存在其他如安全性能上的问题;

2.懒汉式可能出现安全和性能上的问题,如CPU切换出现的不必要错误。

那么,如何优化懒汉式的实现方式呢。有两种方法。

第一种是:

class Single{
private int age;
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
//自定义构造方法
private Single(){
}
//自定义一个对象
static Single s=null;
public static  <span style="background-color: rgb(255, 102, 102);">synchronized </span>Single getInstance(){
if(s==null){
s=new Single();
}
return s;
}
}
红色区域,表示同步,相当于“上锁”,一次只能有一个程序执行。可以避免CPU切换导致的程序错误。很遗憾,这样做会降低执行效率。

第二种是:

class Single{
private int age;
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
//自定义构造方法
private Single(){
}
//自定义一个对象
static Single s=null;
public static  Single getInstance(){
<span style="background-color: rgb(255, 102, 102);">if(s==null){
synchronized(Single.class){
if(s==null)
s=new Single();
}</span>
}
return s;
}
}
这样可以减少“解锁”的次数,提高的效率,但是代码还是没有饿汉式简单。

总结:定义单例,建议使用饿汉式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: