Какие примеры некритических ресурсов? - PullRequest
4 голосов
/ 06 ноября 2011

Цитата из Effective Java гласит:

Второе законное использование финализаторов касается объектов с нативными пирами. нативный узел - это нативный объект, которому нормальный объект делегирует нативные методы. Поскольку нативный узел не является нормальным объектом, сборщик мусора не знать об этом и не может вернуть его, когда его Java-узел исправлен. Финализатор это подходящее транспортное средство для выполнения этой задачи, при условии, что нативный пэр не держит критические ресурсы .

Я не делал C ++ раньше, хотя я смутно осознаю, что обработчики файлов и соединения с базами данных являются критически важными ресурсами. Но что именно означает, что ресурс является некритическим?

Или, скорее, какие примеры некритических ресурсов?

Ответы [ 2 ]

2 голосов
/ 06 ноября 2011

«Некритические ресурсы» не существуют.Цитата не говорит о некритических ресурсах, она просто говорит об отсутствии критических ресурсов.

В некотором смысле вы можете сказать, что память является некритическим ресурсом всистема сбора мусора.Тем не менее, я не уверен, что это будет правильно (на самом деле, наоборот: управляемые ресурсы все еще могут быть критически важными, если они закончатся), и я никогда не слышал, чтобы это было сказано.

1 голос
/ 06 ноября 2011

Не думаю, что это действительно важный ресурс, несмотря на использованную фразу.Я думаю, что он восстанавливает ресурс, который может или не может быть критическим, и цитату можно перефразировать, «предполагая, что это не критично, что ресурс освобожден».

Если важно, чтобы ресурс был освобожденконкретный момент выполнения программы, после того, как объект недоступен, но до того, как ресурс понадобится для какой-либо другой цели, финализатор не подходит.Вместо этого вам нужна программная логика, чтобы убедиться, что это происходит.

Таким образом, дескрипторы файлов или соединения с БД имеют решающее значение, если вы беспокоитесь о том, что можете закончиться, иначе они не критичны.Если вы достигли некоторого предела количества открытых соединений с БД, потому что финализаторы, которые закрывают ваши старые, еще не запущены, и вы пытаетесь открыть другое соединение с БД, скорее всего, это не удастся.Ситуация с памятью несколько лучше, поскольку, если у вас не хватает памяти из-за недоступных объектов и вы пытаетесь создать новый объект, GC по крайней мере попытается найти что-то для завершения и освобождения.

Таким образом, файловые дескрипторы и соединения БД должны иметь функцию close(), которую пользователь может вызвать для освобождения всех ресурсов в тех случаях, когда логика программы может определить, что объект больше не будет использоваться.Ожидать, что GC закроет соединение через финализатор, недостаточно надежно.Это также не очень хорошо справляется с возможностью сброса или сброса коммита, хотя это отдельная проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...