Я собираюсь поговорить с тем, что, как мне кажется, вы действительно исследуете - контрейлерная синхронизация.
Техника, что она выглядит как выпопытка использования включает в себя использование одной энергозависимой переменной в качестве защиты синхронизации совместно с одной или несколькими другими энергонезависимыми переменными.Этот метод применим, когда выполняются следующие условия:
- Только один поток записывает в набор значений, предназначенных для защиты.
- Потоки чтение набор значений будет считывать их только в том случае, если значение летучей защиты соответствует некоторым критериям.
Вы не упоминаете второе условие, имеющее значение true для вашего примера, но мы можем проверитьэто все равно.Модель для writer выглядит следующим образом:
- Запись во все энергонезависимые переменные, при условии, что никакой другой поток не будет пытаться их прочитать.
- По завершении запишите значение в переменную volatile guard, которое указывает на то, что критерии считывателей удовлетворены.
считыватели работают следующим образом:
- Считайте переменную volatile guard в любое время, и если ее значение соответствует критериям, тогда
- Считайте другие энергонезависимые переменные.
Читатели не должны читать другие не-volatile переменные, если переменная volatile guard еще не указывает правильное значение.
Переменная guard действует как гейт.Оно закрыто до тех пор, пока средство записи не установит для него определенное значение или набор значений, которые все соответствуют критериям указания того, что ворота теперь открыты.Энергонезависимые переменные охраняются за воротами.Читатель не имеет права читать их, пока не откроются ворота.Когда ворота открыты, читатель увидит непротиворечивое представление набора энергонезависимых переменных.
Обратите внимание, что не безопасно запускать этот протокол повторно.Автор не может продолжать изменять энергонезависимые переменные, как только он открыл ворота.В этот момент несколько потоков чтения могут считывать эти другие переменные, и они могут - хотя это не гарантировано - см. Обновления этих переменных.Просмотр некоторых, но не всех этих обновлений приведет к противоречивым представлениям набора.
Резервное копирование заключается в том, чтобы управлять доступом к набору переменных без
- созданияструктура для хранения их всех, к которой можно поменять атомарную ссылку, атомно, или
- , используя блокировку для записи и чтения из всего набора переменных взаимоисключающих действий.
Копирование поверх переменной volatile guard - это умный трюк, который нельзя делать случайно.Последующие обновления программы могут нарушать вышеупомянутые хрупкие условия, устраняя гарантии согласованности, предоставляемые моделью памяти Java.Если вы решите использовать эту технику, четко запишите ее инварианты и требования в коде.