实现1:
public class Singleton {
private static Singleton instance;
private Singleton (){ //首先有一个私有的构造器
}
public static Singleton getInstance() {
if(instance==null){
instance=new Singleton ();
}
return instance;
}
}
这种方式是线程不安全的,如果多个线程同时访问的话就可能有多个对象产生,如果在get方法中加同步块的话会影响性能。
实现2:
public class Singleton {
private Singleton(){
}
private static Singleton instance =new Singleton();
public static Singleton getInstance(){
return instance;
}
}
这种方式虽然不存在安全性问题,但是在程序启动的时候就会初始化。
实现3:
public class Singleton {
private static class SingletonHolder {
static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
3种方式中这是最好的解决方案,既解决了线程同步的问题,有在调用的时候才初始化。
同时也有仁兄这样评论:
人云亦云!误人子弟!什么叫“程序启动”?你这个Singleton中只有一个public方法,那么这个类的初始化只有两种可能:
1)、使用Class.forName(),此时会实行static语句。
2)、调用getInstance()方法。
那么只有1)是有性能问题的(你可能加载并初始化了这个类,但没有使用它,然而这种情况很少)。
至于2),是不存在性能问题的(因为只有这1个public方法,所以只有这个方法在第一调用时才初始化实例)
第三种方式是最好的的,但通常第二种方式都是简单可行的。
在评论之前首先要知道几个概念:
1.单实例模式是解决什么问题(为什么要用 单实例)
2.创建单实例会有哪些问题
3.怎么创建它,使它最为合理
经过测试和咨询资深java工程师得知以下方式是最好的,最实用的:
* 满足标准单实例的四个要素:
* 1.该类必须是final类型
* 2.必须要有一个私有的、静态的、final类型的一个该类的对象
* 3.构造方法必须私有
* 4.必须要有一个公有的、静态的、返回该单实例的一个对象的方法
*/
public final class Singleton
{
private static final Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
参考:
1.http://dxblyq3320.iteye.com/blog/445100
2.内部资料
3.http://wushuangyan26.iteye.com/blog/1327985