精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-18
最后修改:2011-05-18
这种实现方法采用内部静态类, 只在第一次调用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的关键字同步代码段,双重是否为空的判断 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-05-18
第一种是延迟加载的,优
|
|
返回顶楼 | |
发表时间:2011-05-18
littcai 写道 第一种是延迟加载的,优
从多线程的角度考虑,会不会有并发问题呢? |
|
返回顶楼 | |
发表时间:2011-05-18
明明有三种方式。。。。
|
|
返回顶楼 | |
发表时间:2011-05-18
twojinyong 写道 明明有三种方式。。。。
除了我说的这三种,你的第三种应该是第四种吧?双锁机制? |
|
返回顶楼 | |
发表时间:2011-05-18
除却线程同步的方法,这三种单例模式之外,还有其他方法么?
个人认为第三种方法兼具了一次实例化和延迟加载的有点,最完美的实现方式 |
|
返回顶楼 | |
发表时间:2011-05-18
nianien 写道 littcai 写道 第一种是延迟加载的,优
从多线程的角度考虑,会不会有并发问题呢? 不会! |
|
返回顶楼 | |
发表时间:2011-05-18
最后修改:2011-05-18
第三种与第一种 是一样的机制,都是通过静态块来初始化的,都是类加载的时候初始化的
第一种与第二种区别也不大,同样是类加载的时候初始化的 |
|
返回顶楼 | |
发表时间:2011-05-18
最后修改:2011-05-18
zhang34082 写道 第三种与第一种 是一样的机制,都是通过静态块来初始化的
怎么能是一样的呢? 都说了实例化的时间不一样 第一种,只要你第一次引用了类,都会触发单例对象的实例化 而第三种,只要你不去调用getInsance方法,是不永远不会实例化单例对象的 |
|
返回顶楼 | |
发表时间:2011-05-18
littcai 写道 第一种是延迟加载的,优
不是延迟加载的,都是类加载的时候 初始化实例变量的,没区别 |
|
返回顶楼 | |