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.
fonte
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.
Ele declara uma seção crítica em torno do bloco de código. No código multithread, @synchronized
garante 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 @synchronized
diretiva impede que vários threads entrem em qualquer região do código protegida por uma @synchronized
diretiva que se refira ao mesmo objeto . O objeto passado para a @synchronized
diretiva é 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 nil
como o objeto de bloqueio, nenhum bloqueio será levado.
@synchronized
ele não fará nada - você ficará desprotegido. 2)@synchronized
é lento .@synchronized
.Da documentação da Apple aqui e aqui :
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.
fonte
A
@synchronized
diretiva é uma maneira conveniente de criar bloqueios mutex dinamicamente no código Objective-C .A
@synchronized
diretiva 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 ...
fonte
@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?
fonte
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.
fonte
@synchronized
é othread safe
mecanismo. O trecho de código escrito dentro dessa função torna-se parte dacritical section
qual apenas um thread pode ser executado por vez.@synchronize
aplica o bloqueio implicitamente enquanto oNSLock
aplica 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.
fonte