Blokowanie dostępu do obiektu przez wiele wątków - Objective-C

Mam pytanie dotyczące bezpieczeństwa nici w Objective-C. Przeczytałem kilka innych odpowiedzi, część dokumentacji Apple i wciąż mam pewne wątpliwości, więc pomyślałem, że zadam własne pytanie.

Moje pytanie brzmitrzykrotnie:

Przypuśćmy, że mam tablicę,NSMutableArray *myAwesomeArray;

Fold 1:

Teraz popraw mnie, jeśli się mylę, ale z tego co rozumiem, używając@synchronized(myAwesomeArray){...} zapobiegnie dostępowi dwóch wątków do tego samego bloku kodu. Tak więc, jeśli mam coś takiego:

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

następnie, jeśli dwa wątki mają dostęp dopodobnie metoda napodobnie czas, ten blok kodu będzie bezpieczny dla wątków. Zgaduję, że dobrze zrozumiałem tę część.

Złóż 2:

Co mam zrobić, jeślimyAwesomeArray jest dostępne dla wielu wątków z różnych metod? Jeśli mam coś takiego:

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

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

Teraz obie metody są dostępne przez dwa różne wątki w tym samym czasie. Jak to zapewnićmyAwesomeArray nie będziesz miał problemów? Czy używam czegoś takiego jak NSLock lub NSRecursiveLock?

Złóż 3:

Teraz w powyższych dwóch przypadkachmyAwesomeArray był iVarem w pamięci. Co jeśli mam plik bazy danych, którego nie zawsze przechowuję w pamięci. TworzędatabaseManagerInstance ilekroć chcę wykonać operacje na bazie danych i zwolnić, gdy skończę. Zatem zasadniczo różne klasy mogą uzyskać dostęp do bazy danych. Każda klasa tworzy własne wystąpienieDatabaseManger, ale w zasadzie wszystkie używają tego samego, pojedynczego pliku bazy danych. Jak upewnić się, że dane nie są uszkodzone z powodu warunków wyścigu w takiej sytuacji?

Pomoże mi to wyjaśnić niektóre z moich podstaw.

questionAnswers(3)

yourAnswerToTheQuestion