Из того, что я понимаю, всегда выглядит так, как если бы кэш был очищен после записи, и всегда выглядит так, как будто чтения выполняются прямо из памяти при чтении. В результате поток всегда будет видеть результаты записи из другого потока и (согласно модели памяти Java) никогда не будет кэшировать значение. Однако фактическая реализация и инструкции процессора будут различаться в зависимости от архитектуры.
Это не гарантирует корректность, если вы увеличиваете переменную более чем в одном потоке или проверяете ее значение и предпринимаете какие-либо действия, поскольку, очевидно, нет никакой фактической синхронизации. Как правило, вы можете гарантировать правильное выполнение только в том случае, если в переменную записывается только поток, а все остальные читают.
Также обратите внимание на то, что 64-битная энергонезависимая переменная может считываться / записываться как две 32-битные переменные, поэтому 32-битные переменные являются атомарными при записи, а 64-битные - нет. Одна половина может быть записана раньше другой, поэтому считываемое значение может быть не старым, а новым.
Это довольно полезная страница из моих закладок:
http://www.cs.umd.edu/~pugh/java/memoryModel/