论坛首页 Java企业应用论坛

为什么需要Singleton

浏览 48045 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-06-11  
qzzlw 写道

类是什么呢?类只不过是方法和数据的集合,方法都在代码段,这部分内存是不可能省掉的。数据如果是静态的,就在全局数据段,这部分永远会加载到内存。实例数据只有在构造类实例的时候才占有堆内存。



我承认 “数据如果是静态的,就在全局数据段”
这部分在类被加载时才会被加载到内存
0 请登录后投票
   发表时间:2009-06-11  
一些显而易见的好处是Singleton可以赋值,可以当成参数或返回值传来传去,多个Singleton可以共同实现某个接口而实现多态。
0 请登录后投票
   发表时间:2009-06-12  
幸存者 写道
一些显而易见的好处是Singleton可以赋值,可以当成参数或返回值传来传去,多个Singleton可以共同实现某个接口而实现多态。

“可以当成参数或返回值传来传去”
这是对象的好处 ,但如果对象是单例,就另当别论了!
不过我们引用Singleton的时候,
好像大多是以这种方式
Singleton singleton = Singleton.getInstance();
那么既然 通过 这种方式就可以引用到 单例
我们 还需要把它作为输入输出,
在方法中作为参数进行引用吗,
单例 只有一个,
所以把它作为参数 和 像上面的方式写在方法里 来获取Singleton,
应该没有区别
那么 何必 把Singleton写在参数列表里呢,因为怎么传都只有它一个

但如果多个Singleton共同实现了某个接口而实现多态。
那么 作为参数或返回值传来传去 就变得有意义了
是一个优势 !!!
不过感觉有点弱(多个Singleton共同实现了某个接口)
0 请登录后投票
   发表时间:2009-06-12  
两种单例的实现而已,都是单例。如果从单例看的话,两者没有区别。
0 请登录后投票
   发表时间:2009-06-13  
唉,讨论了这么多.单例的实现已经很完美了,不需要再多的优化了,但是这种单例只限于同一个jvm 如果我是一个分布式系统 或者不同JVM LZ你又打算如何实现呢?
0 请登录后投票
   发表时间:2009-06-13  
fjlyxx 写道
唉,讨论了这么多.单例的实现已经很完美了,不需要再多的优化了,但是这种单例只限于同一个jvm 如果我是一个分布式系统 或者不同JVM LZ你又打算如何实现呢?


分布式系统 共享一个单例,
如果以对象方式实现 这种单例的 一致性,应该是当
分布式系统中的一个节点 的单例 发生状态改变时,
更新所有节点相应单例的状态,可能一种实现方案就是
通过对象 序列化
虽然类不能 序列化,但它的 静态属性 是可以存储并恢复的,
这也可以解决 AnotherSingleton 在分布式系统下的一致性问题。


0 请登录后投票
   发表时间:2009-06-14  
如果什么都定义STATIC
那在类加载的时候 内存得被占用多少呢?
如果属性被定义成STATIC
那在发生并发的时候如何避免数据准确呢?
如果类都定义成STATIC
那这个类如何重用呢?意思是说这个类同时被多个调用

我只有在数据唯一确定不变的情况下 来做STATIC 例如数据库连接

其他的要视情况而定~~~

例如管理Hibernate的Session 就会用到ThreadLocal 也会被定义成Static 因为就需要使用一个。
0 请登录后投票
   发表时间:2009-06-14  
wy19280469 写道
如果什么都定义STATIC
那在类加载的时候 内存得被占用多少呢?
如果属性被定义成STATIC
那在发生并发的时候如何避免数据准确呢?
如果类都定义成STATIC
那这个类如何重用呢?意思是说这个类同时被多个调用

我只有在数据唯一确定不变的情况下 来做STATIC 例如数据库连接

其他的要视情况而定~

例如管理Hibernate的Session 就会用到ThreadLocal 也会被定义成Static 因为就需要使用一个。

我怎么感觉你说的都不对啊???
? 1,对象创建也需要加载类啊
? 2,static也支持并发啊
? 3,类可以同时被多个调用啊
0 请登录后投票
   发表时间:2009-06-14  
ninini 写道
wy19280469 写道
如果什么都定义STATIC
那在类加载的时候 内存得被占用多少呢?
如果属性被定义成STATIC
那在发生并发的时候如何避免数据准确呢?
如果类都定义成STATIC
那这个类如何重用呢?意思是说这个类同时被多个调用

我只有在数据唯一确定不变的情况下 来做STATIC 例如数据库连接

其他的要视情况而定~

例如管理Hibernate的Session 就会用到ThreadLocal 也会被定义成Static 因为就需要使用一个。

我怎么感觉你说的都不对啊???
? 1,对象创建也需要加载类啊
? 2,static也支持并发啊
? 3,类可以同时被多个调用啊



对象创建也需要加载类啊  --> 不是同一个内存空间  而static 只创建一个内存空间   对象创建是new 的过程
static 不用吧。

static 也支持并发啊  --> 如果定义static 属性的话  怎样保证并发的安全性? 同一个地址 你调用时一个值 如果你改变了这个值的时候 ,那下一个人调用的时候 还以为是原来的值怎么办?

0 请登录后投票
   发表时间:2009-06-14  
wy19280469 写道

对象创建也需要加载类啊  --> 不是同一个内存空间  而static 只创建一个内存空间   对象创建是new 的过程
static 不用吧。

static 也支持并发啊  --> 如果定义static 属性的话  怎样保证并发的安全性? 同一个地址 你调用时一个值 如果你改变了这个值的时候 ,那下一个人调用的时候 还以为是原来的值怎么办?

 

???

创建一了类的对象首先要加载相应类,当然只需要加载一次

static 可以保持线程同步,跟非static是一个道理啊

 

0 请登录后投票
论坛首页 Java企业应用版

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