Увеличение значения между потоками никогда не является поточно-ориентированным, просто volatile
.Это только гарантирует, что каждый поток получает актуальное значение, а не то, что приращение является атомарным, потому что на уровне ассемблера ваш ++ на самом деле представляет собой несколько инструкций, которые можно чередовать.
Вы должны использовать AtomicInteger
для быстрого атомного приращения.
Редактировать : Считывание снова того, что вам нужно, на самом деле является ограничением памяти.В Java нет инструкции ограничения памяти, но вы можете использовать блокировку для ограничения памяти "побочный эффект".В этом случае объявите метод синхронизации синхронизированным, чтобы ввести неявный забор:
void synchronized sync() {
sync++;
}