Блокировка объекта от доступа нескольких потоков - Objective-C

У меня есть вопрос относительно безопасности потоков в Objective-C. Я прочитал несколько других ответов, часть документации Apple, и все еще сомневаюсь в этом, поэтому подумал, что задам свой вопрос.

Мой вопросthree fold:

Предположим, у меня есть массив,NSMutableArray *myAwesomeArray;

Fold 1:

Теперь поправьте меня, если я ошибаюсь, но, насколько я понимаю, используя@synchronized(myAwesomeArray){...} предотвратит доступ двух потоков к одному и тому же блоку кода. Так что, в принципе, если у меня есть что-то вроде:

-(void)doSomething {
    @synchronized(myAwesomeArray) {
        //some read/write operation on myAwesomeArray
    }
}

затем, если два потока обращаются кsame метод наsame время, этот блок кода будет потокобезопасным. Я предполагаю, что правильно понял эту часть.

Fold 2:

Что мне делать, еслиmyAwesomeArray доступ к нескольким потокам из разных методов? Если у меня есть что-то вроде:

- (void)readFromArrayAccessedByThreadOne {
    //thread 1 reads from myAwesomeArray
}

- (void)writeToArrayAccessedByThreadTwo {
    //thread 2 writes to myAwesomeArray
}

Теперь оба метода доступны двум разным потокам одновременно. Как я могу гарантировать, чтоmyAwesomeArray не будет проблем? Я использую что-то вроде NSLock или NSRecursiveLock?

Fold 3:

Теперь в двух вышеупомянутых случаяхmyAwesomeArray был iVar в памяти. Что если у меня есть файл базы данных, который я не всегда сохраняю в памяти. Я создаюdatabaseManagerInstance всякий раз, когда я хочу выполнить операции с базой данных и выпустить ее, как только я закончу. Таким образом, в основном, разные классы могут обращаться к базе данных. Каждый класс создает свой собственный экземплярDatabaseMangerно в основном все они используют один и тот же файл базы данных. Как я могу гарантировать, что данные не будут повреждены из-за состязаний в такой ситуации?

Это поможет мне прояснить некоторые из моих основ.

Ответы на вопрос(3)

Ваш ответ на вопрос