Acabei de criar um método singleton e gostaria de saber o que a função @synchronized()faz, já que a uso com frequência, mas não sei o significado.
Respostas:
Ele declara uma seção crítica em torno do bloco de código. No código multithread, @synchronizedgarante que apenas um thread possa executar aquele código no bloco a qualquer momento.
Se você não está ciente do que ele faz, então seu aplicativo provavelmente não é multithread e você provavelmente não precisa usá-lo (especialmente se o singleton em si não é seguro para thread).
Edit: Adicionando mais algumas informações que não estavam na resposta original de 2011.
A @synchronizeddiretiva impede que vários threads entrem em qualquer região do código protegida por uma @synchronizeddiretiva que se refira ao mesmo objeto . O objeto passado para a @synchronizeddiretiva é o objeto usado como "bloqueio". Duas threads podem estar na mesma região protegida do código se um objeto diferente for usado como bloqueio, e você também pode proteger duas regiões completamente diferentes do código usando o mesmo objeto como bloqueio.
Além disso, se você passar nilcomo o objeto de bloqueio, nenhum bloqueio será levado.
@synchronized.
Da documentação da Apple aqui e aqui :
A diretiva @synchronized é uma maneira conveniente de criar bloqueios mutex dinamicamente no código Objective-C. A diretiva @synchronized faz o que qualquer outro bloqueio mutex faria - evita que diferentes threads adquiram o mesmo bloqueio ao mesmo tempo.
A documentação fornece muitas informações sobre este assunto. Vale a pena reservar um tempo para lê-lo, principalmente porque você o tem usado sem saber o que está fazendo.
A @synchronizeddiretiva é uma maneira conveniente de criar bloqueios mutex dinamicamente no código Objective-C .
A @synchronizeddiretiva faz o que qualquer outro bloqueio mutex faria - impede que diferentes threads adquiram o mesmo bloqueio ao mesmo tempo.
Sintaxe:
@synchronized(key)
{
// thread-safe code
}
Exemplo:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
Agora o código acima é perfeitamente thread-safe ... Agora, vários threads podem alterar o valor.
O acima é apenas um exemplo obscuro ...
@synchronized(val, oldValue) { ... }?
O bloco @synchronized controla automaticamente o bloqueio e desbloqueio para você . @synchronize você tem um bloqueio implícito associado ao objeto que está usando para sincronizar. Aqui está uma discussão muito informativa sobre este tópico, por favor siga. Como @synchronized bloqueia / desbloqueia em Objective-C?
Excelente resposta aqui:
Ajude a entender o método de classe retornando singleton
com mais explicações sobre o processo de criação de um singleton.
@synchronizedé o thread safemecanismo. O trecho de código escrito dentro dessa função torna-se parte da critical sectionqual apenas um thread pode ser executado por vez.
@synchronizeaplica o bloqueio implicitamente enquanto o NSLockaplica explicitamente.
Apenas garante a segurança do fio, não garante isso. O que quero dizer é que você contrata um motorista especializado para o seu carro, mas isso não garante que o carro não sofrerá um acidente. No entanto, a probabilidade permanece a menor.
@synchronizedele não fará nada - você ficará desprotegido. 2)@synchronizedé lento .