Если вы говорите о Какао, функциональность мьютекса там предоставляется NSLock
и NSRecursiveLock
.
Чтобы должным образом защитить неатомарный ресурс, вам нужны эти мьютексы, чтобы несколько потоков не моглипопробуйте изменить данные одновременно (что приведет к повреждению) или использовать данные в наполовину измененном состоянии (что приведет к неверным данным).
Ваш код будет выглядеть примерно так:
static NSLock session_id_lock;
static unsigned int session_id = 1000;
- (int) generateSessionID{
int new_id;
[myLock lock];
new_id = session_id++;
[myLock unlock];
return new_id;
}
Если вы не используете Какао (или то небольшое программирование Какао, которое я помню из своего короткого интерлюдия с iMac, так смутно запомнилось, что оно почти бесполезно), просто используйте концепцию, переведя ее на любой язык или фреймворк:
- заблокировать мьютекс перед использованием или изменением защищенного ресурса.
- использовать или изменить ресурс.
- разблокировать мьютекс.
- бонуссовет 1: заблокируйте мьютекс как можно позже и разблокируйте его как можно скорее.
- бонус совет 2: блокируйте только то, что вам нужно, чтобы избежать ненужных задержек.
Объясняя последний пункт еще немного: если вы синхронизируете self
для двух совершенно не связанных между собой вещей (скажем, идентификатора сеанса и идентификатора пользователя), они будут блокировать друг друга, несмотря на то, что в этом нет необходимости.Я бы предпочел два отдельных мьютекса, чтобы сохранить степень детализации на низком уровне.
Конечно, если у вас есть только мьютекс только для идентификатора сеанса (но смотрите предостережение ниже), не стесняйтесь использовать synchronized(self)
, но я 'Я бы предпочел сделать это по-своему, чтобы потом не попасться при добавлении другого защищенного ресурса.
В любом случае (это упомянутое предостережение) вы, вероятно, обнаружите, что синхронизация на self
не будетадекватно защищать статическую переменную, которая будет совместно использоваться несколькими объектами.Мьютекс должен принадлежать данным , а не тому, кто его использует.