Является ли NSObject методом сохранения атомом?

Является ли NSObject методом сохранения атомом?

Например, при сохранении одного и того же объекта из двух разных потоков, обещано, что счетчик удержания увеличился в два раза или возможно, чтобы счетчик удержания был увеличен только один раз?

Спасибо.

Ответ 1

NSObject, а также функции распределения объектов и сохранения счета являются потокобезопасными - см. Приложение A: Резюме безопасности потока в Руководство по программированию нитей.


Изменить. Я решил взглянуть на часть с открытым исходным кодом Core Foundation. В CFRuntime.c __CFDoExternRefOperation() - это функция, ответственная за обновление счетчиков сохранения. Он проверяет, имеет ли процесс более одного потока, и если он имеет более одного потока, он получает блокировку спина перед обновлением счетчика удержания, что делает эту операцию безопасной.

Интересно, что счетчик сохранения не является атрибутом (или переменной экземпляра) объекта в смысле struct (class). Время выполнения хранит отдельную структуру с удерживающими счетчиками. На самом деле, если я правильно ее понимаю, эта структура представляет собой массив хеш-таблиц, а для каждой хэш-таблицы - прямую блокировку. Это означает, что блокировка относится к нескольким объектам, которые были помещены в одну и ту же таблицу хэшей, то есть блокировка не является глобальной (для всех экземпляров) или экземпляром.