饿汉式:
class Single
{
private static Single s=new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
懒汉式:
class Single
{
private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null)
s=new Single();
return s;
}
}
单例设计模式中的饿汉式和懒汉式在加载时有什么不同?为什么在java开发中一般使用饿汉式,不用懒汉式?作者: 吴琼 时间: 2012-6-27 11:43
饿汗式:顾名思义这个人很饥饿,一上来就先创建对象.先把对象拿到.
class Single
{
private static Single s=new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
懒汉式:顾名思义这个人很懒.先给对象赋个空.谁用谁创建.创建了之后就不为空了.就不能再创建了.只能通过公共方法取得对象来了,确保对象唯一性.
class Single
{
private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null)
s=new Single();
return s;
}
}
懒汉式较常用把.今后结合多线程了之后你就清楚了.多个并发的获取同一个对象. 作者: Forever。 时间: 2012-6-27 11:51
吴琼 发表于 2012-6-27 11:43
饿汗式:顾名思义这个人很饥饿,一上来就先创建对象.先把对象拿到.
class Single
{
/*
Single类一进内存,就已经创建好了对象。
class Single
{
private static Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
这个是先初始化对象。
称为:饿汉式。
*/
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s = new Single();
}
}
return s;
}
}
//对象是方法被调用时,才初始化,也叫做对象的延时加载。成为:懒汉式。
//Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象.
package cn.ineeke.util;
/**
* 单利模式——懒汉式
* @author Neeke www.ineeke.com
*
*/
public class DB {
private static DB db = null;
public static DB getInstance(){
if(db == null){
db = new DB();
}
return db;
}
}
package cn.ineeke.util;
/**
* 单利模式——饿汉式
* @author Neeke www.ineeke.com
*
*/
public class DB {
private static DB db = new DB();
public static DB getInstance(){
return db;
}
}
这种静态初始化的方法是自己被加载时就自己实例化,被形象的称之为饿汉式单例类。而原先的单例模式处理方式要在第一次被引用的时候才会被实例化,就被称为懒汉式单例类。
由于在多线程访问时懒汉式可能会出现创建出多个实例,而若对其使用synchronized的话,则又会降低程序性能。所以推荐使用饿汉式。
懒汉式是,只有用到这个用例的时候,再将他实例化,不会浪费,所以效率要高一些。
饿汉式则是程序只要开始,就将他实例化,到用到他的时候就省去了再实例的时间,所以速度和反应快。这是这俩的区别不过差距不会那么明显。
但是大项目,在效率上体现的就有点明显了。作者: 孙飞 时间: 2012-6-28 14:34
玩单例模式其实就是为了用那唯一对象,获取对象 是单例里面肯定要做的事情,你先做后做都是要做的,所以你是都要创建对象 的,懒汉虽然是延时加载,但还是要加载,在这点上区别不是太大。但开发一般用饿汉式,因为饿汉式安全简单,在懒汉式中,如果 一个人来调用那个静态方法,没什么问题,但如果多个人同时 调用 的话,就容易出问题了。咱拿上面的例子说明吧
class Single
{
private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null)
s=new Single();
return s;
}
}
例如有一个a来调用方法,进来判断一下,s==空,它就进来了,如果正好这时cpu切换到别的程序上了,那a就先停那儿了,如果等一下b也来调用,因为if语句下面还没执行,s仍为空,好,b也进来了,然后cpu就没切,让b把下面执行了,new了一个对象,完了后又切到a了,因为a在之前已经判断过了,也该执行new对象那一步了,它就也new了一个对象,这样的话堆内就不是一个对象 了,就不符合单例模式的对象唯一性了,当然这个问题在多线程时可以用同步代码块解决,但总的说虽然懒汉式用的技术多,但没有饿汉式好用安全,所以一般都用饿汉式作者: 汪璨 时间: 2012-6-28 17:45
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
懒汉式如果在创建实例对象时不加上synchronized则会导致线程安全问题
所以一般用饿汉式。