@Synchronized karşılıklı dışlama sağlamak için "kilit" ve "kilit açma" işlevlerini kullanmıyor mu? Peki o zaman kilitleme / kilit açma nasıl yapılır?
Aşağıdaki programın çıktısı sadece "Merhaba Dünya" dır.
@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];
}
lock
Nesne her çağrıda oluşturulur, böylece bir durum olabilir asla nerede bir @synchronized
başka dışarı blok kilitler. Ve bu karşılıklı bir dışlama olmadığı anlamına gelir.) Elbette, yukarıdaki örnek işlemi yapıyor, main
yine de hariç tutulacak bir şey yok, ancak bu kodu başka bir yere körü körüne kopyalamamalısınız.