Я собираюсь поговорить о том, что, по моему мнению, вас действительно может интересовать совмещение синхронизации.
Техника, которую вы, похоже, пытаетесь использовать, включает использование одной энергозависимой переменной в качестве защиты синхронизации в сочетании с одной или несколькими другими энергонезависимыми переменными. Этот метод применим, когда выполняются следующие условия:
- Только один поток будет записывать в набор значений, которые должны быть защищены.
- Потоки, читающие набор значений, будут считывать их только в том случае, если изменчивое защитное значение соответствует некоторым критериям.
Вы не упомянули второе условие, справедливое для вашего примера, но мы все равно можем его изучить. Модель для писателя выглядит следующим образом:
- Напишите во все энергонезависимые переменные, предполагая, что ни один другой поток не попытается их прочитать.
- После завершения запишите значение в переменную volatile guard, указывающее, что критерии считывателя соблюдены.
читатели работают следующим образом:
- Читать переменную volatile guard в любое время, и если ее значение соответствует критериям, то
- Прочтите другие энергонезависимые переменные.
Считыватели не должны считывать другие энергонезависимые переменные, если изменчивая защитная переменная еще не указывает правильное значение.
Защитная переменная действует как ворота. Он закрыт до тех пор, пока писатель не установит для него определенное значение или набор значений, которые все соответствуют критериям, указывающим на то, что ворота теперь открыты. Энергонезависимые переменные охраняются за воротами. Читателю не разрешается читать их, пока ворота не откроются. Как только ворота открыты, читатель увидит непротиворечивое представление набора энергонезависимых переменных.
Обратите внимание, что многократно запускать этот протокол небезопасно. Писатель не может продолжать изменять энергонезависимые переменные после того, как он открыл ворота. В этот момент несколько потоков чтения могут считывать эти другие переменные, и они могут, хотя и не гарантированно, видеть обновления этих переменных. Просмотр некоторых, но не всех этих обновлений приведет к противоречивым представлениям набора.
Подводя итог, хитрость здесь заключается в том, чтобы контролировать доступ к набору переменных без
- создание структуры для хранения их всех, на которую атомарная ссылка может быть заменена, гм, атомарно или
- использование блокировки, чтобы сделать запись и чтение из всего набора переменных взаимоисключающими действиями.
Совмещение поверх изменчивой переменной guard — это хитрый трюк, который нельзя делать небрежно. Последующие обновления программы могут нарушить вышеупомянутые хрупкие условия, лишив гарантии согласованности, предоставляемые моделью памяти Java. Если вы решите использовать этот метод, четко задокументируйте его инварианты и требования в коде.
person
seh
schedule
29.05.2011
AtomicReferenceArray
, либоAtomicIntegerArray
, либо просто посмотрите, что предлагает Unsafe. Я отвечу о несвежей части. - person bestsss   schedule 29.05.2011Unsafe
— это полностью неподдерживаемый API, который вы не должны использовать. Это позволяет тривиально скомпрометировать надежность JVM, даже не покидая Java. Вы должны использовать хаки, чтобы обойти защиту, которая затрудняет доступ. - person Tom Hawtin - tackline   schedule 29.05.2011Unsafe
и как оно связано с вопросом? - person fredoverflow   schedule 29.05.2011sun.misc.Unsafe
, и если вы не знаете, что это такое, то он вам точно не нужен. - person bestsss   schedule 29.05.2011