标题: 单例问题 [打印本页] 作者: 戎石锁 时间: 2012-8-11 08:01 标题: 单例问题 利用枚举
enum a{
A
}
只有一个对象 这样设置的单例模式
和普通的单例模式
懒汉式
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
s = new Single();
return s;
}
}
在使用上有什么区别???还是有什么局限性?作者: 王程 时间: 2012-8-11 08:25
用枚举创建的单例是在这个类被加载时,就已经在内存中创建了实例对象,即没有延迟加载,而懒汉式在程序运行时一开始没有创建实例对象,
s = new Single();当程序运行到这句语句时才会创建对象,即延迟加载,这个应该是最大的区别了。
而且楼主写的懒汉式没有用到双重判断,在多线程的程序中可能会出现错误,
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)//当第一个线程运行完这一句后,可能释放执行权,给其他线程,其他线程进来后,判断出s==null,就会执行下一句,而第一个线程之后夺回执行权又会再创建一个对象,就不能保证是一个对象了
s = new Single();
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;
}
}