Bloqueando um Objeto de Ser Acessado por Diversos Encadeamentos - Objective-C

Eu tenho uma pergunta sobre segurança de thread em Objective-C. Eu li algumas outras respostas, algumas da documentação da Apple, e ainda tenho algumas dúvidas sobre isso, então pensei em fazer minha própria pergunta.

Minha pergunta étrês vezes:

Suponha que eu tenha uma matrizNSMutableArray *myAwesomeArray;

Dobre 1:

Agora corrija-me se estou enganado, mas pelo que entendi, usando@synchronized(myAwesomeArray){...} impedirá que dois threads acessem o mesmo bloco de código. Então, basicamente, se eu tiver algo como:

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

então, se dois threads acessarem omesmo método nomesmo tempo, esse bloco de código será thread-safe. Eu estou supondo que eu entendi esta parte corretamente.

Dobra 2:

O que eu faço semyAwesomeArray está sendo acessado por vários threads de diferentes métodos? Se eu tenho algo parecido com:

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

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

Agora, ambos os métodos são acessados ​​por dois threads diferentes ao mesmo tempo. Como posso garantir quemyAwesomeArray não terá problemas? Eu uso algo como NSLock ou NSRecursiveLock?

Dobrar 3:

Agora, nos dois casos acima,myAwesomeArray Era um iVar na memória. E se eu tiver um arquivo de banco de dados que nem sempre tenho na memória. Eu crio umdatabaseManagerInstance sempre que eu quiser executar operações de banco de dados e liberá-lo assim que eu terminar. Assim, basicamente, classes diferentes podem acessar o banco de dados. Cada classe cria sua própria instância deDatabaseManger, mas basicamente, todos eles estão usando o mesmo arquivo de banco de dados único. Como posso garantir que os dados não sejam corrompidos devido a condições de corrida em tal situação?

Isso me ajudará a esclarecer alguns dos meus fundamentos.

questionAnswers(3)

yourAnswerToTheQuestion