我正在阅读Java中的弱引用后,找到一个SO帖子,并意识到我真的不知道他们是什么。使用WeakReference的Java示例的线程安全
下面的代码是从第457,第17章:在“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”WeakReference的引用。这为参照物创建了一个强有力的参考,因此即使在空检查之后,对readFile范围之外的参照物的所有其他强引用都消失了(什么是正确的术语?),并且即使假设参照物不是轻度可达的,垃圾收集器也不是允许清除弱引用,从而使所指对象可终结,因为仍然有来自数据的本地强引用。因此,如果data != null
行中的数据不为空,则在下一行中返回时不能为空。正确吗?
而不是同步,我会做一个类,保存文件和数据作为最终变量。然后对该类进行易变的引用。然后readFile可以获得对该类引用的本地引用,并通过该方法使用它。然后在完成时更新实例字段。 – 2011-06-17 15:18:42
@Michael你是对的,那绝对是一种方式。我只想指出实现它的最简单方法。 – Waldheinz 2011-06-17 22:28:13