Допустим, у меня есть метод, к которому обращаются два или более потоков, и я хочу сделать его потокобезопасным.
public int getVal(int x, int y, MyClass myObj)
{
int z;
z = getInt(myObj);
return x + y + z;
}
Здесь, я думаю, нам не нужно синхронизировать для x + y, поскольку они примитивны.
Предположим, что getInt (myObj)
изменяет состояние myObj и это влияет на значение z.
Следовательно, мне нужно будет обеспечить синхронизацию для строки z = getInt ( myObj);
, но только когда оба потока передают один и тот же экземпляр в ссылке myObj. Как разработчик API, я бы не знал, будут ли оба потока передавать один и тот же экземпляр для myObj или нет. В некоторых случаях эти потоки могут передавать один и тот же экземпляр MyClass в ссылке 'myObj', а в других случаях они могут передавать разные экземпляры MyClass в ссылке 'myObj'.
Итак, как можно обеспечить безопасность потоков для строки z = getInt (myObj)
? (Конечно, мы не хотим синхронизировать, когда переданные экземпляры разные, и синхронизировать нужно только тогда, когда переданные экземпляры такие же. Ясно, что это не может быть определено).
Предполагая, что MyClass нельзя сделать неизменяемым, я думаю, что следующим решением может быть следующее:
synchronized(myObj)
{
z = getInt(myObj);
}
Правильное ли это решение? А также, возникает странная ошибка ... Я получаю сообщение об ошибке: Завершение работы приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «Невозможно создать ...
Я пытаюсь добавить CoreData в существующий проект и странная ошибка ...
Я получаю сообщение об ошибке:
Завершение работы приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: 'Невозможно создать NSPersistentStoreCoordinator с nil model '
в RootView есть предупреждение в:
- (NSFetchedResultsController *)fetchedResultsController;
в строке:
_fetchedResultsController.delegate = self;
и говорится:
warning: class' RootViewController ' не реализует 'NSFetchedResultsControllerDelegate' протокол
какие-нибудь идеи?