【发布时间】:2011-06-17 08:06:53
【问题描述】:
在看到 SO 帖子并意识到我并不真正知道它们是什么之后,我正在阅读 Java 中的弱引用。
以下代码来自第 457 页,第 17 章:Arnold、Gosling 和 Holmes 撰写的“Java 编程语言第四版”中的“垃圾收集和内存”
import java.lang.ref.*;
import java.io.File;
class DataHandler {
private File lastFile; // last file read
private WeakReference<byte[]>
lastData;// last data (maybe)
byte[] readFile(File file) {
byte[] data;
// check to see if we remember the data
if file.equals(lastFile) {
data = lastData.get();
if (data != null)
return data;
}
// don't remember it, read it in
data = readBytesFromFile(file);
lastFile = file;
lastData= new WeakReference<byte[]>(data);
return data;
}
}
我试图理解,只是为了练习它,如果这段代码是线程安全的,我主要关注的代码部分是行
data = lastData.get();
if (data != null)
return data;
我的想法如下:“数据”是线程受限的,并设置为引用“lastData”弱引用的引用。这会创建对所指对象的强引用,因此即使在空检查之后,对 readFile 范围之外的所指对象的所有其他强引用都消失了(正确的术语是什么?),即使假设所指对象不可软访问,垃圾收集器也不会允许清除弱引用,从而使所指对象可终结,因为仍然存在来自数据的本地强引用。因此,如果data != null 行中的数据不为空,则在下一行中返回时它不能为空。对吗?
【问题讨论】:
标签: java garbage-collection thread-safety weak-references