Спецификация Java: пункт 12.6.2. Финализация объектов. Взаимодействие с моделью памяти
Модель памяти должна иметь возможность решать, когда она может фиксировать действия, выполняемые в финализаторе. В этом разделе описывается взаимодействие финализации с моделью памяти.
У каждого выполнения есть несколько точек принятия решения о достижимости (decision points), обозначенных как di. Каждое действие идет либо до di (comes-before), либо после di (comes-after). За исключением явно указанного, упорядочение "предшествует" (comes-before), описанное в этом разделе, не связано со всеми другими порядками в модели памяти.
Если r - это чтение, при котором запись w и r предшествует di, то w должно предшествовать di.
Если x и y являются действиями синхронизации для одной и той же переменной или монитора, так что so(x, y) и y предшествует di, то x должен предшествовать di.
В каждой точке принятия решения о достижимости некоторый набор объектов помечается как недостижимый, а некоторое подмножество этих объектов помечается как финализируемое. Эти точки принятия решения о достижимости также являются точками, в которых ссылки проверяются, ставятся в очередь и очищаются в соответствии с правилами, приведенными в документации API для пакета java.lang.ref.
Единственные объекты, которые считаются определенно достижимыми в точке di, - это те, которые могут быть показаны как достижимые с применением следующих правил:
- Объект B определенно доступен в di из статических полей, если существует запись w1 в статическое поле v класса C, такое что значение, записанное w1, является ссылкой на B, класс C загружается доступным загрузчиком классов и не существует записи w2 в v такой, что hb(w2, w1) неверно, и обе w1 и w2 предшествуют di.
- Объект B определенно достижим из A в di, если существует запись w1 в элемент v из A такая, что значение, записанное w1, является ссылкой на B, и не существует записи w2 в v, такой что hb(w2, w1) неверно, и w1 и w2 предшествуют di.
- Если объект C определенно достижим из объекта B, а объект B определенно достижим из объекта A, то C определенно достижим из A.
Если объект X помечен как недоступный в di, то:
- X не должен быть определенно достижимым в di из статических полей; и
- Все активные использования X в потоке t, которые идут после di, должны происходить при вызове финализатора для X или в результате выполнения потоком t чтения, которое следует после di ссылки на X; и
- Все чтения, которые идут после di, которые видят ссылку на X, должны видеть записи в элементы объектов, которые были недоступны в di, или видеть записи, которые пришли после di.
Действие a является активным использованием X тогда и только тогда, когда выполняется хотя бы одно из следующего:
- читает или записывает элемент X
- a блокирует или разблокирует X, и есть действие блокировки для X, которое происходит - после вызова финализатора для X
- a пишет ссылку на X
- a - активное использование объекта Y, а X определенно достижим из Y
Если объект X отмечен как финализируемый в di, то:
- X должен быть помечен как недоступный в di; и
- di должно быть единственным местом, где X помечен как финализируемый; и
- действия, которые происходят после вызова финализатора, должны идти после di.
Читайте также:
- Спецификация Java: пункт 12.6. Финализация экземпляров классов
- Спецификация Java: пункт 12.6.1. Реализация финализации
- Метод clone и интерфейс Cloneable в Java
Комментарии
Отправить комментарий