微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 两次获得完全相同的对象引用的可能性有多大

我有时会假设如果oldobject!= newObject,那么对象已经改变了 – 在大多数情况下这似乎是一个公平的假设,但它真的是一个错误的假设吗?

简而言之,在什么情况下,以下代码可以打印“相同!”?

static WeakReference<Object> oldO = null;
...

Object o = new Object();
oldO = new WeakReference(o);

// Do some stuff with o - Could take hours or even days to complete.
...

// discard o (or let it go out of scope).
o = null;

// More stuff - Could be hours or days later.
...
o = new Object();

// Later still.
if ( o == oldO.get() ) {
  System.out.println("Same!");
}

我意识到这确实是远程可能的,因为对象引用本质上是对象的内存地址(或者可能在某些JVM中).但它有多大可能?我们是否在实际发生之前谈论了几十年的运行时间?

添加

我道歉 – 请假设oldO是某种形式的弱引用,不会阻止它被收集.也许它是弱的,因为代码(现在)建议或引用存储在某个数据库文件中.

解决方法

(我正在回答我认为你真正想知道的事情,而不是你所拥有的特定片段)

它依赖于实现.对象引用的契约是,只要对象仍然存在,没有其他对象将==与它进行比较.这意味着在对象被垃圾收集之后,VM可以自由地重用相同的对象引用.

Java的实现可以选择使用递增的整数进行对象引用,在这种情况下,当引用计数器溢出回0时,您只能获得相同的对象引用.其他实现可能使用内存位置,这使得它更可能用于相同的引用被重用.在任何情况下,如果重要,您应该定义自己的对象标识.

原文地址:https://www.jb51.cc/java/125666.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐