论坛首页 Java企业应用论坛

非线程同步机制下线程安全的单例模式——最优的单例模式

浏览 15134 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-18   最后修改:2011-05-18
个人认为下面是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的关键字同步代码段,双重是否为空的判断
   发表时间:2011-05-18  
第一种是延迟加载的,优
0 请登录后投票
   发表时间:2011-05-18  
littcai 写道
第一种是延迟加载的,优

从多线程的角度考虑,会不会有并发问题呢?
0 请登录后投票
   发表时间:2011-05-18  
明明有三种方式。。。。
0 请登录后投票
   发表时间:2011-05-18  
twojinyong 写道
明明有三种方式。。。。

除了我说的这三种,你的第三种应该是第四种吧?双锁机制?
0 请登录后投票
   发表时间:2011-05-18  
除却线程同步的方法,这三种单例模式之外,还有其他方法么?

个人认为第三种方法兼具了一次实例化和延迟加载的有点,最完美的实现方式
0 请登录后投票
   发表时间:2011-05-18  
nianien 写道
littcai 写道
第一种是延迟加载的,优

从多线程的角度考虑,会不会有并发问题呢?

不会!
0 请登录后投票
   发表时间:2011-05-18   最后修改:2011-05-18
第三种与第一种 是一样的机制,都是通过静态块来初始化的,都是类加载的时候初始化的
第一种与第二种区别也不大,同样是类加载的时候初始化的
0 请登录后投票
   发表时间:2011-05-18   最后修改:2011-05-18
zhang34082 写道
第三种与第一种 是一样的机制,都是通过静态块来初始化的

怎么能是一样的呢?
都说了实例化的时间不一样
第一种,只要你第一次引用了类,都会触发单例对象的实例化
而第三种,只要你不去调用getInsance方法,是不永远不会实例化单例对象的
0 请登录后投票
   发表时间:2011-05-18  
littcai 写道
第一种是延迟加载的,优

不是延迟加载的,都是类加载的时候 初始化实例变量的,没区别
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics