读书人

非线程同步机制上线程安全的单例模式

发布时间: 2012-12-28 10:29:05 作者: rapoo

非线程同步机制下线程安全的单例模式——最优的单例模式
个人认为下面是Java实现的最优的单例模式
这种实现方法采用内部静态类,
只在第一次调用getInstance方法的时候才实例化单例对象
如果不调用,就不会进行单例对象的实例化,
因此,既实现了延迟实例化,又不需要线程同步
public enum Enum {INSTANCE;}
你这代码能说明什么?延迟实例化,还是线程安全?



你自己可以写代码测试一下,你介绍的那几种单例模式 都可以通过反射机制创建出不同的对象,而通过枚举实现的单例则不能
的确不能再被实例化,但是它的实例化是不能延迟的 49 楼 zean 2011-05-19 nianien 写道个人认为下面是Java实现的最优的单例模式
这种实现方法采用内部静态类,
只在第一次调用getInstance方法的时候才实例化单例对象
如果不调用,就不会进行单例对象的实例化,
因此,既实现了延迟实例化,又不需要线程同步
引用
public class SingleTon {

private SingleTon(){}

public static SingleTon getInstance() {
return SingleTonHolder.instance;
}

private static class SingleTonHolder{
private static SingleTon instance=new SingleTon();
}
}



下面这种单例模式是应用最多的,同样不存在线程同步的问题
但是,不能实现延迟实例化
引用
public class SingleTon {

private SingleTon(){}
private static SingleTon s=new SingleTon();

public static SingleTon getInstance() {
return s;
}

}



这种单例模式,和上面的实现差不多,虽然能够延迟单例对象的实例化,但是都是在同一时间范围内完成的
引用
public class SingleTon {

private SingleTon(){}
private static SingleTon s;

static {
s=new SingleTon();
}

public static SingleTon getInstance() {
return s;
}
}


下面这种就是


还有两种解决方案,不在本帖讨论范围之内
1.采用synchronized的关键字同步getInstance方法
2.采用synchronized的关键字同步代码段,双重是否为空的判断

========================
Class.forName("SingleTon$SingleTonHolder"); 50 楼 nianien 2011-05-20 zean 写道nianien 写道个人认为下面是Java实现的最优的单例模式
这种实现方法采用内部静态类,
只在第一次调用getInstance方法的时候才实例化单例对象
如果不调用,就不会进行单例对象的实例化,
因此,既实现了延迟实例化,又不需要线程同步
引用
public class SingleTon {

private SingleTon(){}

public static SingleTon getInstance() {
return SingleTonHolder.instance;
}

private static class SingleTonHolder{
private static SingleTon instance=new SingleTon();
}
}



下面这种单例模式是应用最多的,同样不存在线程同步的问题
但是,不能实现延迟实例化
引用
public class SingleTon {

private SingleTon(){}
private static SingleTon s=new SingleTon();

public static SingleTon getInstance() {
return s;
}

}



这种单例模式,和上面的实现差不多,虽然能够延迟单例对象的实例化,但是都是在同一时间范围内完成的
引用
public class SingleTon {

private SingleTon(){}
private static SingleTon s;

static {
s=new SingleTon();
}

public static SingleTon getInstance() {
return s;
}
}


下面这种就是


还有两种解决方案,不在本帖讨论范围之内
1.采用synchronized的关键字同步getInstance方法
2.采用synchronized的关键字同步代码段,双重是否为空的判断

========================
Class.forName("SingleTon$SingleTonHolder");
跟你能看到内部类似的~ 51 楼 java_user 2011-05-20 nianien 写道zhang34082 写道第三种与第一种 是一样的机制,都是通过静态块来初始化的
怎么能是一样的呢?
都说了实例化的时间不一样
第一种,只要你第一次引用了类,都会触发单例对象的实例化
而第三种,只要你不去调用getInsance方法,是不永远不会实例化单例对象的

第三种是类加载的时候就实例化了吧 52 楼 lishaorui 2011-05-20 单例模式,楼主提到的第一种是比较好的。这些内容在研磨设计模式和漫谈设计模式中都有所讲解,iteye上有他们的博客。 53 楼 david3083 2011-05-21 画蛇添足 54 楼 theoffspring 2011-05-30 第一种就行了,比双重锁check要简单。

读书人网 >编程

热点推荐