Si plusieurs objets accèdent à votre objet uniquement pour en lire le contenu, vous n'avez pas du tout besoin de verrou. Si au moins un des objets accède à votre objet pour écrire/mettre à jour son contenu, peu importe si les autres objets accèdent à votre objet pour le lire ou l'écrire/le mettre à jour: dans ce cas, vous avez besoin d'un verrou. Maintenant, afin de protéger correctement votre objet (dans une section de code critique où plusieurs objets peuvent y accéder), vous devez utiliser la même INSTANCE de VERROUILLAGE qui doit être partagée par TOUS les objets possibles accédant à l'objet que vous sont prêts à protéger.
Si votre application a besoin de protéger un objet accessible simultanément par la majorité des classes, alors avoir une seule instance de verrouillage est très bien. Si vous voulez de meilleures performances (surtout si le nombre d'accès simultanés à votre objet est élevé), vous pouvez avoir plusieurs verrous. Chaque verrou sera responsable d'autoriser/refuser l'accès à un attribut/champ spécifique de votre objet. De cette façon, plusieurs objets peuvent accéder à votre objet en changeant simultanément un attribut/champ différent. Vous incrémentez fondamentalement le nombre d'opérations simultanées sur votre objet. Cependant, chaque verrou DOIT TOUJOURS être partagé entre les autres objets qui accèderont à l'objet que vous protégez. Avoir une instance de verrouillage pour chaque contrôleur ne fonctionne tout simplement pas; Cela ne protège PAS votre objet des accès simultanés d'autres objets dans des threads différents. NSLock est implémenté à l'aide de mutex pthread POSIX, il doit donc être utilisé exactement de la même manière. Cela est également clairement indiqué dans la documentation NSLock:
Avertissement: La classe NSLock utilise des threads POSIX pour implémenter son comportement de verrouillage. Lorsque vous envoyez un message de déverrouillage à un objet NSLock, vous devez vous assurer que ce message est envoyé par le même thread qui a envoyé le message de verrouillage initial. Déverrouiller un verrou à partir d'un thread différent peut entraîner un comportement indéfini. Ainsi, afin de préserver la sémantique de la section critique, c'est le même thread qui a acquis le verrou chargé de le relâcher une fois terminé. Notez également que le mécanisme de verrouillage est destiné uniquement aux opérations rapides, c'est-à-dire que vous ne devez acquérir un verrou que pendant une courte période avant de le relâcher. Si vous devez attendre une durée imprévisible, vous avez besoin d'un mécanisme de synchronisation différent, à savoir une variable de condition disponible via la classe NSCondition.
Espérons que cela aide.
Soyez très effrayé lorsque vous utilisez des serrures codées à la main, et méfiez-vous de leur besoin. –
Je ne suis pas sûr de ce que cela signifie. Le guide Données de base suggère de verrouiller l'accès à un contexte d'objet géré si le thread est utilisé. Que pourrais-je utiliser d'autre que pour une paire de verrouillage-déverrouillage 'NSLock' codée à la main? –
Ouais, je disais juste, attention ... dans ce cas, c'est approprié. –