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, @synchronizedgarantit 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 @synchronizeddirective empêche plusieurs threads d'entrer dans une région de code protégée par une @synchronizeddirective faisant référence au même objet . L'objet passé à la @synchronizeddirective 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 nilcomme 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 @synchronizeddirective est un moyen pratique de créer des verrous mutex à la volée dans du code Objective-C .
La @synchronizeddirective 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.
@synchronizedest le thread safemé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.
@synchronizeapplique le verrou implicitement alors NSLockqu'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.
@synchronizedcela ne fait rien - vous n'êtes pas protégé. 2)@synchronizedest lent .