@synchronized n'utilise-t-il pas "lock" et "unlock" pour réaliser une exclusion mutuelle? Comment fait-il le verrouillage/déverrouillage alors?Comment @synchronized se verrouille/se déverrouille-t-il dans Objective-C?
La sortie du programme suivant est uniquement "Hello World".
@interface MyLock: NSLock<NSLocking>
@end
@implementation MyLock
- (id)init {
return [super init];
}
- (void)lock {
NSLog(@"before lock");
[super lock];
NSLog(@"after lock");
}
- (void)unlock {
NSLog(@"before unlock");
[super unlock];
NSLog(@"after unlock");
}
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
MyLock *lock = [[MyLock new] autorelease];
@synchronized(lock) {
NSLog(@"Hello World");
}
[pool drain];
}
Remarque: En relation avec http://stackoverflow.com/questions/1215765/ –
Vous n'avez pas besoin de surcharger init si vous n'en avez pas besoin. L'exécution appelle automatiquement l'implémentation de la superclasse si vous ne remplacez pas une méthode. –
Une chose importante à noter est que le code ci-dessus n'est pas synchronisé. L'objet 'lock' est créé à chaque appel, il n'y aura donc jamais de cas où un bloc' @ synchronized' en verrouille un autre. Et cela signifie qu'il n'y a pas d'exclusion mutuelle.) Bien sûr, l'exemple ci-dessus fait l'opération dans 'main', donc il n'y a rien à exclure de toute façon, mais il ne faut pas copier aveuglément ce code ailleurs. –