Я щойно створив синглтон-метод, і я хотів би знати, що @synchronized()
робить функція , оскільки я часто її використовую, але не знаю значення.
Відповіді:
Він оголошує критичний розділ навколо блоку коду. У багатопотоковому коді @synchronized
гарантує, що тільки один потік може виконувати цей код у блоці в будь-який момент часу.
Якщо ви не знаєте, що він робить, то ваша програма, ймовірно, не є багатопотоковою, і вам, ймовірно, не потрібно її використовувати (особливо якщо сам синглтон не захищений від потоків).
Редагувати: Додавання додаткової інформації, якої не було в оригінальній відповіді від 2011 року.
@synchronized
Директива запобігає кілька потоків від входу будь-якої ділянки коду , який захищений з допомогою @synchronized
директиви зі посиланням на той же об'єкт . Об'єкт, переданий @synchronized
директиві, є об'єктом, який використовується як "замок". Два потоки можуть знаходитися в одній захищеній області коду, якщо в якості блокування використовується інший об'єкт, а також ви можете захищати дві абсолютно різні області коду, використовуючи той самий об'єкт, що і замок.
Крім того, якщо ви випадково переходите nil
як об'єкт блокування, замок взагалі не буде прийнятий.
@synchronized
.
З документації Apple тут і тут :
Директива @synchronized - це зручний спосіб створення блокування мьютексу на льоту в коді Objective-C. Директива @synchronized робить те, що робив би будь-який інший блокування mutex - вона заважає різним потокам отримувати один і той же замок одночасно.
Документація містить велику інформацію з цього питання. Варто витратити час, щоб прочитати його, особливо враховуючи те, що ви користувались ним, не знаючи, що він робить.
@synchronized
Директива являє собою зручний спосіб для створення м'ютекс замки на льоту в Objective-C код.
@synchronized
Директива робить те , що будь-який інший замок м'ютекс робитиме-он запобігає різні потоки від придбання такої ж замок одночасно.
Синтаксис:
@synchronized(key)
{
// thread-safe code
}
Приклад:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
Тепер наведений вище код ідеально безпечний для потоків. Тепер кілька потоків можуть змінити значення.
Вище - лише неясний приклад ...
@synchronized(val, oldValue) { ... }
?
@synchronized block автоматично обробляє блокування та розблокування для вас . @synchronize у вас є неявна блокування, пов’язана з об’єктом, який ви використовуєте для синхронізації. Ось дуже інформативна дискусія на цю тему. Будь ласка, дотримуйтесь Як @synchronized блокування / розблокування в Objective-C?
Чудова відповідь тут:
Допоможіть зрозуміти метод класу, що повертає синглтон
з подальшим поясненням процесу створення синглтона.
@synchronized
є thread safe
механізмом. Шматок коду, записаний всередині цієї функції, стає частиною critical section
, яку одночасно може виконувати лише один потік.
@synchronize
застосовує блокування неявно, тоді як NSLock
застосовує його явно.
Це лише забезпечує безпеку нитки, а не гарантує це. Я маю на увазі, що ви наймаєте для свого автомобіля досвідченого водія, але це не гарантує, що автомобіль не зіткнеться з ДТП. Однак ймовірність залишається найменшою.
@synchronized
він нічого не робить - ви залишаєтесь незахищеними. 2)@synchronized
є повільним .