Я знаю, что finalize () вызывается всякий раз, когда экземпляр класса собирается сборщиком мусора.Однако я немного запутался, когда передавал экземпляр класса другому потоку через очередь.
Допустим, это скелет потока 1:
for(i=0; i<1000; i++) {
Packet pkt = new Packet(); // instance of class
pkt.id = i;
thread2.queue.put(pkt);
}
Затем поток 2удалит пакет из очереди и выполнит длительные операции.Получает ли этот второй поток «копию» пакета, или это какая-то ссылка?Важность состоит в том, что, если это происходит путем копирования, finalize () в экземпляре, созданном в потоке 1, может быть вызван до того, как поток 2 будет выполнен с пакетом.Если это по ссылке, я гарантирую, что finalize () вызывается только один раз для информации в пакете.
Этот базовый пример может не показывать важность, но я сохраняю C-указатель (из JNI) в пакете, чтобы уничтожить часть памяти, когда я закончу с объектомЕсли он передается копией, память может быть уничтожена до того, как с ней завершит работу второй поток.Если он передается по ссылке, то он должен быть уничтожен только после того, как сборщик мусора обнаружит, что он больше не используется обоими потоками (мое желаемое поведение).Если этот последний сценарий не гарантирован, я не буду использовать finalize () и буду использовать что-то еще, но это будет более сложным.