Single类一进内存就已经创建好了对象,不会出现类似于懒汉的问题。我们使用单例就是因为要再内存中保证唯一对象,所以不建议使用懒汉式 作者: 韩慧阳 时间: 2012-5-16 15:16
懒汉式:
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if (s==null)
s = new Single();
return s ;
}
}
懒汉式在多线程中是不安全的,因为这个类的对象在内存中只有在调用getInstance()方法的时候才会被创建。而s又是static的,所以在多线程中有多个线程访问getInstance()
的时候,就需要同步代码块来保证安全问题。(为什么会不安全请看毕老师的那个售票系统的例子)。
class Single
作者: 潘东升 时间: 2012-5-16 16:02
饿汗式和懒汉式在多线程中的区别
饿汗式在多线程中,因为取得对象的getInstance方法体中只有一句返回对象语句,所以不会出现安全问题题。
而懒汉式是延时加载的,就是被调用时实例才加载,问题就出现在这。如果多个线程同时调用,比如A,B两个线程同时调用,因为线程具有随机性,就有可能在实例没加载时,A通过if判断以后停住了,因为此时可能A没获取CPU执行权,而此时实例也还没被加载,也就是S==null,所以B获取CPU执行权有机会进来了,然后创建了对象,等到A获取执行权了以后,还会再创建一个新对象,这就是问题所在了,要解决这个问题,只能同步处理了,而同步处理有两种方式,同步函数和同步代码块,如果使用同步函数,在多线程调用时,每次都要同步判断,就会消耗资源,想要减少资源浪费,可以双重判断同步代码块,也就是下面这种形式。毕老师的day11-15讲的很清楚了,不懂再看看
//饿汗式
class Single
{
private static final Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
//懒汉式
class SingleLan
{
private static SingleLan s = null;
private SingleLan(){}
public static SingleLan getInstance()
{
if (s==null)
{
return new SingleLan();
}
return s;
}
}
//以下方式解决懒汉式多线程安全问题
class SingleLan
{
private static SingleLan s = null;
private SingleLan(){}
public static SingleLan getInstance()
{
if(s==null)
synchronized(SingleLan.class)
{
if (s==null)
{
return new SingleLan();
}
return new SingleLan();
}
return s;
}
}作者: 黑马-王建雨 时间: 2012-5-16 16:34
1,饿汉式。先初始化对象。
class Single {
Single s = new single();
private Single(){}
public static Single getInstance(){
return s;
}
}作者: 黑马-王建雨 时间: 2012-5-16 16:36
2,懒汉式(也称作延迟加载)。对象被调用时才初始化。
class Single{
private static Single s = null;
private Single(){}
public static Single getInstance{
if(s == null)
s=new Single();
return s;
}
}
饿汉式特点:Single类一进内存,就已经创建好了对象。
懒汉式特点:Single类一进内存,对象还没有存在,只有调用getInstance方法时,才建立对象,这就称为 延迟加载。
开发时:建议使用饿汉式。