В этом учебнике (link) на летучей декларации Java заключается в следующем примере:разовых безопасная публикация через Java летучего
public class BackgroundFloobleLoader {
public volatile Flooble theFlooble;
public void initInBackground() {
// do lots of stuff
theFlooble = new Flooble(); // this is the only write to theFlooble
}
}
public class SomeOtherClass {
public void doWork() {
while (true) {
// do some stuff...
// use the Flooble, but only if it is ready
if (floobleLoader.theFlooble != null)
doSomething(floobleLoader.theFlooble);
}
}
}
Говорит, что фоновый поток загружается из базы данных, так что я думаю, что автор означает, что экземпляр new Flooble()
занимает значительное количество времени.
Цитирую: Without the theFlooble reference being volatile, the code in doWork() would be at risk for seeing a partially constructed Flooble as it dereferences the theFlooble reference.
Как это может быть? Я бы ожидал противоположного. То есть, я ожидал, что без волатильной декларации поток, вызывающий метод doWork
, рискует увидеть Флообл с опозданием или вообще никогда.
Вы никогда не сможете увидеть его, увидеть его поздно и/или увидеть его в несогласованном состоянии. – assylias
Кажется, что экземпляр должен быть полным (даже если чтение базы данных занимает много времени) до назначения ссылки. В этом случае я не понимаю, почему ссылка на объект будет находиться в противоречивом состоянии. – H2ONaCl
Именно ваше ожидание - разумное ожидание, но, к сожалению, если бы это было так, то Java не смогла бы масштабировать до большого количества одновременных процессоров. –