Я читаю о слабых ссылках в Java после того, как прочитал SO сообщение и понял, что на самом деле не знаю, что это было.
Следующий код взят из стр. 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;
Я думаю так: «данные» ограничены потоками и настроены на ссылку на референт WeakReference «lastData».Это создает сильную ссылку на референт, поэтому даже если после нулевой проверки все другие сильные ссылки на референт за пределами области действия readFile исчезают (каков правильный термин?), И даже если предположить, что референт не доступен мягко, сборщик мусора непозволил очистить слабую ссылку, тем самым делая референт финализируемым, потому что по-прежнему существует локальная сильная ссылка на него из данных.Следовательно, если данные не являются нулевыми в строке data != null
, они не могут быть нулевыми при возврате в следующей строке.Правильно?