Спецификация 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.

Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки