上一篇博文写了个简单的单例模式,那是用饿汉式实现的,其实,实现单例模式可以通过两种方式,一个是饿汉式,另外一个是懒汉式。
先回顾一下饿汉式单例的写法:
//饿汉式
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;
}
}
这样可以减少“解锁”的次数,提高的效率,但是代码还是没有饿汉式简单。
总结:定义单例,建议使用饿汉式。