Sperren des Zugriffs mehrerer Threads auf ein Objekt - Objective-C

Ich habe eine Frage zur Thread-Sicherheit in Objective-C. Ich habe ein paar andere Antworten gelesen, einige der Apple-Dokumentationen, und habe immer noch einige Zweifel, also dachte ich, ich stelle meine eigene Frage.

Meine Frage istdreifach:

Angenommen, ich habe ein Array,NSMutableArray *myAwesomeArray;

Falte 1:

Korrigiere mich jetzt, wenn ich mich irre, aber nach dem, was ich verstehe, benutze@synchronized(myAwesomeArray){...} verhindert, dass zwei Threads auf denselben Codeblock zugreifen. Also im Grunde, wenn ich etwas habe wie:

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

dann, wenn zwei Threads auf die zugreifengleich Methode bei dergleich Mal ist dieser Codeblock threadsicher. Ich schätze, ich habe diesen Teil richtig verstanden.

Falte 2:

Was mache ich wennmyAwesomeArray wird von mehreren Threads aus verschiedenen Methoden zugegriffen? Wenn ich etwas habe wie:

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

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

Jetzt wird auf beide Methoden von zwei verschiedenen Threads gleichzeitig zugegriffen. Wie stelle ich das sicher?myAwesomeArray keine Probleme haben? Benutze ich so etwas wie NSLock oder NSRecursiveLock?

Falte 3:

Nun, in den beiden oben genannten Fällen,myAwesomeArray war ein iVar in Erinnerung. Was ist, wenn ich eine Datenbankdatei habe, die ich nicht immer im Speicher habe? Ich erstelle einedatabaseManagerInstance wann immer ich Datenbankoperationen durchführen und freigeben möchte, sobald ich fertig bin. Grundsätzlich können also verschiedene Klassen auf die Datenbank zugreifen. Jede Klasse erstellt eine eigene Instanz vonDatabaseMangerIm Grunde genommen verwenden alle dieselbe Datenbankdatei. Wie stelle ich sicher, dass Daten aufgrund der Rennbedingungen in einer solchen Situation nicht beschädigt werden?

Dies wird mir helfen, einige meiner Grundlagen zu klären.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage