@ synchronized не защищает блок кода от повторного ввода - он предотвращает выполнение любого кода, который также использует @synchronized с тем же объектом.Таким образом, если у вас есть два метода
- (void)method1 {
@synchronized (self) { dothis (); }
}
- (void)method2 {
@synchronized (self) { dothat (); }
}
и два разных потока, вызывающих method1 и method2 для одного и того же объекта, то dothis () и dothat () будут вызываться один за другим.Конечно, это также верно, если два разных потока вызывают method1 для одного и того же объекта.@synchronized не мешает вам вводить блок в том же потоке, поэтому в приведенном выше примере dothis () может вызвать [self method2], и он не будет заблокирован.
Если вы используете volatile или OSMemoryBarrier (), тогда я полагаю, что ваш дизайн слишком, слишком, слишком сложен, и у вас рано или поздно возникнут проблемы.