Насколько я знаю, «бывает-до» заявляет, что изменения, сделанные внутри синхронизированного, видны для следующего потока, синхронизируясь на одной и той же блокировке.java.io.FileInputStream обращается к частной изменчивой переменной «закрыт» только из внутреннего синхронизированного блока. Зачем?
private final Object closeLock = new Object();
private volatile boolean closed = false;
public void close() throws IOException {
synchronized (closeLock) {
if (closed) {
return;
}
closed = true;
}
if (channel != null) {
channel.close();
}
fd.closeAll(new Closeable() {
public void close() throws IOException {
close0();
}
});
}
Разве это не избыточно?
Любое воздействие на производительность будет отрицательным, хотя, не так ли? – jaco0646
@ jaco0646 Я предполагал, что я не знаю об усилении или проигрыше производительности при объединении волатильных и синхронизированных блоков для ввода-вывода файлов. Я предполагаю, что этот код был таким образом в течение некоторого времени, не отслеживая историю файла. Поскольку есть способы внести свой вклад в java-кодовую базу, я также предполагаю, что если бы это была большая потеря производительности, она была бы обнаружена и исправлена в какой-то момент. Независимо от того, что результат эффективности выходит за рамки OP. –