我正在閱讀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