Je viens de créer une méthode singleton, et j'aimerais savoir ce que fait la fonction @synchronized()
, car je l'utilise fréquemment, mais je ne connais pas la signification.
Réponses:
Il déclare une section critique autour du bloc de code. Dans le code multithread, @synchronized
garantit qu'un seul thread peut exécuter ce code dans le bloc à un moment donné.
Si vous ne savez pas ce qu'il fait, votre application n'est probablement pas multithread et vous n'avez probablement pas besoin de l'utiliser (surtout si le singleton lui-même n'est pas thread-safe).
Edit: Ajout d'informations supplémentaires qui ne figuraient pas dans la réponse d'origine de 2011.
La @synchronized
directive empêche plusieurs threads d'entrer dans une région de code protégée par une @synchronized
directive faisant référence au même objet . L'objet passé à la @synchronized
directive est l'objet qui est utilisé comme "verrou". Deux threads peuvent être dans la même région protégée du code si un objet différent est utilisé comme verrou, et vous pouvez également protéger deux régions de code complètement différentes en utilisant le même objet que le verrou.
De plus, si vous passez nil
comme objet de verrouillage, aucun verrou ne sera pris du tout.
@synchronized
.
De la documentation Apple ici et ici :
La directive @synchronized est un moyen pratique de créer des verrous mutex à la volée dans du code Objective-C. La directive @synchronized fait ce que ferait n'importe quel autre verrou mutex: elle empêche différents threads d'acquérir le même verrou en même temps.
La documentation fournit une mine d'informations sur ce sujet. Cela vaut la peine de prendre le temps de le lire, d'autant plus que vous l'utilisez sans savoir ce qu'il fait.
La @synchronized
directive est un moyen pratique de créer des verrous mutex à la volée dans du code Objective-C .
La @synchronized
directive fait ce que n'importe quel autre verrou mutex ferait: elle empêche différents threads d'acquérir le même verrou en même temps.
Syntaxe:
@synchronized(key)
{
// thread-safe code
}
Exemple:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
Maintenant, le code ci-dessus est parfaitement thread-safe..Maintenant, plusieurs threads peuvent changer la valeur.
Ce qui précède n'est qu'un exemple obscur ...
@synchronized(val, oldValue) { ... }
?
Le bloc @synchronized gère automatiquement le verrouillage et le déverrouillage pour vous . @synchronize vous avez un verrou implicite associé à l'objet que vous utilisez pour synchroniser. Voici une discussion très informative sur ce sujet, veuillez suivre Comment @synchronized verrouille / déverrouille dans Objective-C?
Excellente réponse ici:
Aide à comprendre la méthode de classe renvoyant un singleton
avec plus d'explications sur le processus de création d'un singleton.
@synchronized
est le thread safe
mécanisme. Le morceau de code écrit à l'intérieur de cette fonction devient la partie de critical section
, sur laquelle un seul thread peut s'exécuter à la fois.
@synchronize
applique le verrou implicitement alors NSLock
qu'il l'applique explicitement.
Il assure seulement la sécurité du fil, pas le garantit. Ce que je veux dire, c'est que vous embauchez un chauffeur expert pour votre voiture, mais cela ne garantit pas que la voiture ne rencontrera pas d'accident. Cependant, la probabilité reste la moindre.
@synchronized
cela ne fait rien - vous n'êtes pas protégé. 2)@synchronized
est lent .