请问:一个singleton对象的声明周期?

iforem 2003-08-19 08:24:15
一个单例类,被实例化

那么这个singleton的声明周期是一直都存在?还是被gc回收(当无引用的时候)?

我感觉singleton对象会一直存在,因为自引用



...全文
29 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yak2002 2003-09-09
  • 打赏
  • 举报
回复
主要是JVM决定的...

一般来说, reference 有四种, Singleton永远保留一个Strong reference, 因此
不可能被Garbage Collector收集.
jeffyan77 2003-09-09
  • 打赏
  • 举报
回复
我同意armorking2003(阿墨)、netcobol(初学者) 的观点。
廖雪峰 2003-09-09
  • 打赏
  • 举报
回复
jvm 对于每个静态变量,线程对象都会保持一份引用,只有结束程序才会回收
廖雪峰 2003-09-09
  • 打赏
  • 举报
回复
事实上,对于static变量,自从类加载器加载此类后到程序结束,该变量都不会被gc回收,但是第一次加载在什么时候要看外部类什么时候引用它,jvm的类加载器是动态加载类的。

singleton可以在加载类时就初始化:
private static Singleton instance = new Singleton();
好处是getInstance()方法不需要同步:
static public Singleton getInstance() { return instance; }

也可以需要时加载:
static synchronized public Singleton getInstance(){
if (instance == null) {
instance = new Singleton();
}
return instance;
}

这时必须同步整个方法,注意不能使用双重检查,因为java和C++不同,不支持双重检查,
以下是错误的:
static public Singleton getInstance() {
if(instance==null){
synchronized(this) {
if(instance==null)
instance=new Singleton();
}
}
return instance;
}
netcobol 2003-09-09
  • 打赏
  • 举报
回复
事实上,因为对象是static 的,只要jvm还没关掉
就一直存在
vc_hking 2003-09-01
  • 打赏
  • 举报
回复
你可以在gc中销毁掉呀
xiaow 2003-08-22
  • 打赏
  • 举报
回复
啊啊。看了你的例子,应该是第一次运行getInstance()后这个实例对象才会生成,然后,由于是静态的,这个对象不会被销毁。
iforem 2003-08-21
  • 打赏
  • 举报
回复

大家能说说singleton类的实例会一直存在的原因吗?

我的理解是这样的:
在前面所说的singleton实现中,一旦singleton类被实例化,将会有一个静态的引用一直指向它(static private Singleton instance)

也就是说,对这个实例,不会出现没有人引用它的情况,所以,这个实例对象会一直存在,不会被jvm回收



iforem 2003-08-21
  • 打赏
  • 举报
回复
怎么没有人啊?
chyihill 2003-08-21
  • 打赏
  • 举报
回复
因为对象是static 的,所以就一直存在,直到jvm关闭,小心,如果对象太大的话,会很占内存的,有可能会导致outofmomeny的。。
freejacky 2003-08-20
  • 打赏
  • 举报
回复
singleton对象的生命周期是:从程序运行,一直到程序退出。
armorking2003 2003-08-20
  • 打赏
  • 举报
回复
事实上,只要jvm还没关掉
就一直存在
freejacky 2003-08-20
  • 打赏
  • 举报
回复
不把App Server关掉,应该是一直存在吧
iforem 2003-08-20
  • 打赏
  • 举报
回复
对于这种实现,singleton类的一个实例会一直存在吗?

public class Singleton
{
static private Singleton instance;

//constructor
//从配置文件中读取配置信息到数据结构中
private Singleton ()
{
……………………….
}

//返回唯一实例.如果是第一次调用此方法,则创建实例
static synchronized public Singleton getInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}

//读取数据结构中的配置信息
public String getProperty(String key)
{
return xxxx;
}
}
bdsc 2003-08-20
  • 打赏
  • 举报
回复
跟具体实现有关的
AlanLuo_2002 2003-08-19
  • 打赏
  • 举报
回复
singleton对象的确会一直存在因为一般singleton对象都是static的,所以初始化好以后就一直存在了

50,527

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧