饿汉式和懒汉式
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=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; } }这样可以减少“解锁”的次数,提高的效率,但是代码还是没有饿汉式简单。
总结:定义单例,建议使用饿汉式。
相关文章推荐
- Java单例模式:饿汉式和懒汉式的实现
- 单例模式--饿汉式、懒汉式、线程安全的懒汉式、高性能安全的懒汉式
- 黑马程序员——单例(懒汉式+饿汉式)
- java 单例模式:饿汉式与懒汉式 区别
- 单例模式(懒汉式与饿汉式),新增有关线程安全部分的介绍
- 单例模式分类之懒汉式与饿汉式
- 单例模式的懒汉式和饿汉式
- Java之单例模式(饿汉式、懒汉式)
- 单例模式的各种写法和总结 懒汉式 饿汉式 登记式
- 饿汉式与懒汉式单例模式的区别
- Java饿汉式单例模式和懒汉式单例模式
- 简单java单例模式 懒汉式、饿汉式以及解决线程安全问题(synchronized)
- 单例模式(懒汉式与饿汉式)
- Java中如果把构造方法也私有化,如何创建对象?Java的单例设计模式——饿汉式和懒汉式区别
- 单例设计模式(懒汉式,饿汉式,枚举式,双重检测锁式,静态内部类式)
- 单例模式的懒汉式和饿汉式
- java 单例模式 懒汉式 饿汉式 写法实例
- android之单例模式:懒汉式和饿汉式的区别
- 设计模式——懒汉式单例类PK饿汉式单例类
- 单例模式的懒汉式和饿汉式实现分析