我的一个java对象,有好几个地方引用。比如 a、b、c、d四个引用都指向同一个对象。单纯a=null,另外几个b、c、d仍然不为null,对象还是不能被销毁。我的目的是销毁一个对象 ,并让它的所有引用都变成 null
解决方案 »
- JCheckBox.setSelected(true)界面没效果,问题定位
- 我想写一个多界面的C/S架构的管理系统,那些面版都写到一个类里面吗?
- 腾讯正在举行活动,发放6位QQ号送分,http://vip.rl35.com/vip_qq/vip.htm?QQ=890890
- [求助]关于Choice类的区分
- 求如何用socket实现多台客户端向一台服务器传输文件,急!在线等!
- 请大家帮忙解答个问题,进者有分
- 问个简单的问题
- Java字库的文字
- 哪位高手为我详细的讲一下SUPER超类啊。。不是很明白。。。
- 请问在java中怎样打开不同类型的文件,如用word打开.doc文件,用写字板打开.txt文件等等。
- 浮点数为什么要用移码,而不用补码呢?
- 实现接口与继承抽象类有什么区别??
import java.lang.ref.WeakReference;
……A a=new A();
……
//使用完了a,将它设置为弱引用,并释放引用
WeakReference wr=new WeakReference(a);
a=null;
……
//下次使用时
if(wr!=null)
{
a=wr.get();
}
else
{
a=new A();
wr=new WeakReference(a);
}
我的意思是,一个对象在A、B两个地方被引用,在A地方的引用被置为null以后,B地方的引用仍不为null,怎么样让B地方的引用自动也为null?例如下例
/////////////////////
public class M {
public static void main(String[] args) {
SvgUse su = new SvgUse();
AbsShape a = su.child;//a和su.child两个引用指向一个对象
a = null;//a置为null
System.out.println(su.child);//但su.child不为null
System.out.println(a);//a为null
}
}class SvgUse {
public AbsShape child = new AbsShape();
}class AbsShape {
}
class AbsShape {
boolean valid=true;
}
我知道,你使用一下弱引用,只要释放一处,所有的地方就都被释放了,如果你对弱引用不是很了解你可以去找一下相关资料了解一下弱引用与垃圾回收器的关系,我把你代码改下,你看看import java.lang.ref.WeakReference;
public class M {
public static void main(String[] args) {
SvgUse su = new SvgUse();
AbsShape a = su.child;//a和su.child两个引用指向一个对象 WeakReference wr=new WeakReference(a); a = null;//a置为null
System.out.println(su.child);//但su.child不为null
System.out.println(a);//a为null
}
} class SvgUse {
public AbsShape child = new AbsShape();
} class AbsShape {
}
当你想把a,b都设为空时,迭代HashSet并赋值null就可以了.销毁对象,JVM会自动处理的,人工管理太麻烦.
a对象存在一个唯一指向b对象的引用,b对象存在一个唯一指向x对象的应用,当b(或a)不再被引用时,x对象也会被垃圾回收的.关键是,程序员在使用集合类的时候,不要将太多的数据存放至集合对象(比如10万个数据放入HashSet),这样JVM内存会有可能暴掉.
public static void main(String[] args) {
SvgUse su = new SvgUse();
AbsShape a = su.child;//a和su.child两个引用指向一个对象
WeakReference wr = new WeakReference(a);
a = null;//a置为null
System.out.println(su.child);//但su.child不为null
System.out.println(a);//a为null
}
}class SvgUse {
public AbsShape child = new AbsShape();
}class AbsShape {
}
输出结果
AbsShape@a90653
null我希望的是两个输出都为null,至少能从su.child自身识别出它被删除了
使用一个包装器类,包裹你的对象,所有原先期望指向该对象的引用都换成指向该包装器对象(当然类型是不一样的)
当需要使用实际的对象时,从包装器中将它取出,并保证用完之后不在程序的其他地方保持对实际对象的强引用
当需要销毁时,将该包装器类的实际对象引用置为null,那么所有指向该包装器的引用将无法得到实际对象!
通常使用jdk提供的4个引用等级的包装器是比较理想的
你可以把你的系统设计成在某个位置保持实际对象的强引用,而当它不再有存在的必要时,将它置为null,那么它就有机会在JVM做垃圾回收时将它销毁
如果工厂认为应该向你提供对象,那么你就能得到,否则就返回一个null
这两种策略都不可能在你的代码上透明过渡,都需要修改你的系统设计!
但这样一来,系统的设计要做不小的改动
可以看看Java Pitfalls一书中的介绍。
所谓的弱引用,更是在搞笑.
如果我要把一个变量传给一个方法,你弱给我看看.传给内部类,你弱给我看看.
另外,如果我有三个变量都抓住这个对象的弱引用,当我释放其中一个另两个也自动释放?
要解决这个问题除非拿到JDK源码,自己修改插入一个方法,setNull(Object o),
然后把那个对地址空间的内容全部memreset为0.
凭什么要求别人一定要采用你那根本不可行的方法,别人不采用就发怒?
public static void main(String[] args) {
SvgUse su = new SvgUse();
AbsShape a = su.child;//a和su.child两个引用指向一个对象
WeakReference wr = new WeakReference(a);
a = null;//a置为null
System.out.println(su.child);//但su.child不为null
System.out.println(a);//a为null
}
} class SvgUse {
public AbsShape child = new AbsShape();
} class AbsShape {
}
输出结果
AbsShape@a90653
null
我希望的是两个输出都为null,至少能从su.child自身识别出它被删除了 希望你用弱引用把上述代码修改一下,能使得
两个输出都为null
有人在搞笑,还装很懂,说白了,这是不可能实现的,因为这是一个语法的原因:
String s = "xxxx";
String s1 = s;
String s2 = s;
无论你s指向什么,不可能在语句s = null时同时自动执行s1 = null;s2 = null;
这不是说改变原来指向的结对象是什么,或以什么方式指向对象,而是同时执行三条重新赋值语句,
和它们用什么方向指向对象以及原来对象是什么没有关系.对于这样的结果还说有解的话,到底是不是无知,那只能是公道自在人心了.
就象说在算术运行的前提下,让1+1=1,我说无解,那么有解的人是无知还是有知?
不要保存引用,需要的时候使用一个函数获取所需的对象,这正是OO最基本的思想,如果要考虑效率问题的话根本就别用java了。