锁定老帖子 主题:为什么需要Singleton
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-11
qzzlw 写道 类是什么呢?类只不过是方法和数据的集合,方法都在代码段,这部分内存是不可能省掉的。数据如果是静态的,就在全局数据段,这部分永远会加载到内存。实例数据只有在构造类实例的时候才占有堆内存。 我承认 “数据如果是静态的,就在全局数据段” 这部分在类被加载时才会被加载到内存 |
|
返回顶楼 | |
发表时间:2009-06-11
一些显而易见的好处是Singleton可以赋值,可以当成参数或返回值传来传去,多个Singleton可以共同实现某个接口而实现多态。
|
|
返回顶楼 | |
发表时间:2009-06-12
幸存者 写道 一些显而易见的好处是Singleton可以赋值,可以当成参数或返回值传来传去,多个Singleton可以共同实现某个接口而实现多态。
“可以当成参数或返回值传来传去” 这是对象的好处 ,但如果对象是单例,就另当别论了! 不过我们引用Singleton的时候, 好像大多是以这种方式 Singleton singleton = Singleton.getInstance(); 那么既然 通过 这种方式就可以引用到 单例 我们 还需要把它作为输入输出, 在方法中作为参数进行引用吗, 单例 只有一个, 所以把它作为参数 和 像上面的方式写在方法里 来获取Singleton, 应该没有区别 那么 何必 把Singleton写在参数列表里呢,因为怎么传都只有它一个 但如果多个Singleton共同实现了某个接口而实现多态。 那么 作为参数或返回值传来传去 就变得有意义了 是一个优势 !!! 不过感觉有点弱(多个Singleton共同实现了某个接口) |
|
返回顶楼 | |
发表时间:2009-06-12
两种单例的实现而已,都是单例。如果从单例看的话,两者没有区别。
|
|
返回顶楼 | |
发表时间:2009-06-13
唉,讨论了这么多.单例的实现已经很完美了,不需要再多的优化了,但是这种单例只限于同一个jvm 如果我是一个分布式系统 或者不同JVM LZ你又打算如何实现呢?
|
|
返回顶楼 | |
发表时间:2009-06-13
fjlyxx 写道 唉,讨论了这么多.单例的实现已经很完美了,不需要再多的优化了,但是这种单例只限于同一个jvm 如果我是一个分布式系统 或者不同JVM LZ你又打算如何实现呢?
分布式系统 共享一个单例, 如果以对象方式实现 这种单例的 一致性,应该是当 分布式系统中的一个节点 的单例 发生状态改变时, 更新所有节点相应单例的状态,可能一种实现方案就是 通过对象 序列化 虽然类不能 序列化,但它的 静态属性 是可以存储并恢复的, 这也可以解决 AnotherSingleton 在分布式系统下的一致性问题。 |
|
返回顶楼 | |
发表时间:2009-06-14
如果什么都定义STATIC
那在类加载的时候 内存得被占用多少呢? 如果属性被定义成STATIC 那在发生并发的时候如何避免数据准确呢? 如果类都定义成STATIC 那这个类如何重用呢?意思是说这个类同时被多个调用 我只有在数据唯一确定不变的情况下 来做STATIC 例如数据库连接 其他的要视情况而定~~~ 例如管理Hibernate的Session 就会用到ThreadLocal 也会被定义成Static 因为就需要使用一个。 |
|
返回顶楼 | |
发表时间:2009-06-14
wy19280469 写道 如果什么都定义STATIC
那在类加载的时候 内存得被占用多少呢? 如果属性被定义成STATIC 那在发生并发的时候如何避免数据准确呢? 如果类都定义成STATIC 那这个类如何重用呢?意思是说这个类同时被多个调用 我只有在数据唯一确定不变的情况下 来做STATIC 例如数据库连接 其他的要视情况而定~ 例如管理Hibernate的Session 就会用到ThreadLocal 也会被定义成Static 因为就需要使用一个。 我怎么感觉你说的都不对啊??? ? 1,对象创建也需要加载类啊 ? 2,static也支持并发啊 ? 3,类可以同时被多个调用啊 |
|
返回顶楼 | |
发表时间:2009-06-14
ninini 写道 wy19280469 写道 如果什么都定义STATIC
那在类加载的时候 内存得被占用多少呢? 如果属性被定义成STATIC 那在发生并发的时候如何避免数据准确呢? 如果类都定义成STATIC 那这个类如何重用呢?意思是说这个类同时被多个调用 我只有在数据唯一确定不变的情况下 来做STATIC 例如数据库连接 其他的要视情况而定~ 例如管理Hibernate的Session 就会用到ThreadLocal 也会被定义成Static 因为就需要使用一个。 我怎么感觉你说的都不对啊??? ? 1,对象创建也需要加载类啊 ? 2,static也支持并发啊 ? 3,类可以同时被多个调用啊 对象创建也需要加载类啊 --> 不是同一个内存空间 而static 只创建一个内存空间 对象创建是new 的过程 static 不用吧。 static 也支持并发啊 --> 如果定义static 属性的话 怎样保证并发的安全性? 同一个地址 你调用时一个值 如果你改变了这个值的时候 ,那下一个人调用的时候 还以为是原来的值怎么办? |
|
返回顶楼 | |
发表时间:2009-06-14
wy19280469 写道
对象创建也需要加载类啊 --> 不是同一个内存空间 而static 只创建一个内存空间 对象创建是new 的过程 static 不用吧。 static 也支持并发啊 --> 如果定义static 属性的话 怎样保证并发的安全性? 同一个地址 你调用时一个值 如果你改变了这个值的时候 ,那下一个人调用的时候 还以为是原来的值怎么办?
??? 创建一了类的对象首先要加载相应类,当然只需要加载一次 static 可以保持线程同步,跟非static是一个道理啊
|
|
返回顶楼 | |