Блокировка объекта от доступа нескольких потоков - 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
но в основном все они используют один и тот же файл базы данных. Как я могу гарантировать, что данные не будут повреждены из-за состязаний в такой ситуации?
Это поможет мне прояснить некоторые из моих основ.