Я пытаюсь понять ключевое слово Java volatile
относительно , написание изменчивой атомной переменной в многопоточной программе с кэшами процессора.Является ли Java volatile препятствием для кэширования или обеспечения сквозного кэширования?
Я прочитал несколько руководств и Специфика языка Java, в частности section 17.4.5 on "happens-before ordering". Я понимаю, что когда поток записывает новое значение в переменную volatile, обновленное значение должно быть видимым для других потоков, читающих эту переменную. Для меня эта семантика может быть реализована одним из двух способов:
Потоки могут кэшировать летучий переменной в кэше процессора, но записи переменной в кэше необходимо немедленно промыть в основную память. Другими словами, кеш составляет write-through.
Нити никогда не могут кэшировать изменчивую переменную и должны читать и записывать такие переменные в основной памяти.
подход 1 упоминается в этом tutorial (http://tutorials.jenkov.com), который говорит:
Объявив переменна счетчика летучих все записи в счетчик переменной будут записаны обратно в основную память немедленно.
подход 2 упоминается в вопросе StackOverflow «Volatile variable in Java», а также это tutorial, который говорит:
Значение этой переменной не будет кэшировать поток локально: все читает и пишет пойдет прямо в «главную память»
Какой из них правильный подход, используемый в Java?
Похожие StackOverflow вопросы, которые делают не ответить на мой вопрос:
Does Java volatile read flush writes, and does volatile write update reads
Java volatile and cache coherence
Ни то, ни другое. Это заставляет забор памяти в точке назначения, то есть запись в переменную volatile * и все предыдущие записи * становятся видимыми для других потоков, если эти потоки сначала считывают одну и ту же изменчивую переменную. Никакой эффект не гарантируется, если не происходит чтения одного и того же летучего. – markspace
Ответ SO, который вы цитируете в «Подходе 2», выглядит правильно: «« Изменчивая переменная в Java »выглядит правильно (ужины включены, и я только дал ей быстрый просмотр). Учебник, на который вы ссылаетесь в« приближении 2 », появляется – markspace