Если несколько объектов получают доступ к вашему объекту только для чтения его содержимого, вам вообще не нужна блокировка. Если хотя бы один из объектов обращается к вашему объекту для записи/обновления его содержимого, то не имеет значения, обращаются ли другие объекты к вашему объекту для чтения или записи/обновления: в этом случае вам нужна блокировка.
Теперь, чтобы правильно защитить ваш объект (в критическом разделе кода, в котором несколько объектов могут получить к нему доступ), вы должны использовать САМОЕ БЛОКОВОЕ ИНСТРУКЦИЮ, которое затем должно быть общим для ВСЕХ возможных объектов, обращающихся к объекту, который вы готовы защитить.
Если вашему приложению необходимо защитить объект, к которому может одновременно обращаться большинство классов, то наличие экземпляра с одним замком в порядке. Если вам нужны лучшие результаты (особенно если количество одновременных обращений к вашему объекту велико), вы можете иметь несколько блокировок. Каждая блокировка будет отвечать за разрешение/запрет доступа к определенному атрибуту/полю вашего объекта. Таким образом, несколько объектов могут получить доступ к вашему объекту, изменяя другой атрибут/поле одновременно. Вы в основном увеличиваете количество одновременных операций над своим объектом. Однако каждая блокировка ДОЛЖНА STILL быть разделена между другими объектами, которые будут обращаться к объекту, который вы защищаете.
Наличие экземпляра блокировки для каждого контроллера просто НЕ работает; это НЕ защитит ваш объект от одновременных доступов от других объектов в разных потоках. NSLock реализуется с использованием POSIX pthread mutexes, поэтому его нужно использовать точно так же. Это также четко указано в документации NSLock:
Предупреждение. Класс NSLock использует потоки POSIX для реализации его поведения блокировки. При отправке сообщения разблокировки объекту NSLock вы должны быть уверены, что сообщение отправлено из того же потока, который отправил исходное сообщение блокировки. Разблокировка блокировки из другого потока может привести к неопределенному поведению.
Итак, чтобы сохранить семантику критического раздела, это тот же поток, который получил блокировку, которая отвечает за ее освобождение по завершении. Также обратите внимание, что механизм блокировки предназначен только для быстрых операций, т. Е. Вы должны приобрести блокировку только на короткий промежуток времени, прежде чем ее освободить. Если вам нужно ждать непредсказуемого количества времени, вам нужен другой механизм синхронизации, а именно переменная условия, доступная через класс NSCondition.
Надеюсь, это поможет.
Будьте очень бойтесь при использовании замков с ручным кодированием и будьте осторожны с необходимостью для них. –
Я не уверен, что это значит. В руководстве по основным данным предлагается блокировать доступ к контексту управляемого объекта, если используется потоковая передача. Что еще я использовал бы, кроме пары «блокировка-разблокировка» NSLock? –
Да, я просто говорил, не смотрю ... в этом случае это уместно. –