Указатели опасности - это метод безопасного восстановления памяти в коде без блокировки без сбора мусора.
Идея заключается в том, что перед доступом к объекту, который может быть удален одновременно, поток устанавливает свой указатель на опасность для указания на этот объект. Поток, который хочет удалить объект, сначала проверяет, установлены ли какие-либо указатели опасности для указания на этот объект. Если это так, удаление будет отложено, так что поток доступа не завершит чтение удаленных данных.
Теперь представьте, что наш поток удаления начинает перебирать список указателей опасности, а в элементе i+1
он выгружается. Теперь другой поток устанавливает указатель опасности на i
на объект, который в настоящий момент пытается удалить поток удаления. После этого удаление потока возобновляется, проверяет остальную часть списка и удаляет объект, даже если теперь указатель опасности находится в позиции i
, указывающей на объект.
Таким образом, достаточно просто установить указатель опасности недостаточно, так как нить удаления уже проверила наш указатель опасности и решила, что наш поток не хочет получать доступ к объекту. Как я могу убедиться, установив указатель опасности, что объект, который я пытаюсь получить, не будет удален из-под моих рук?