Apakah @synchronized tidak menggunakan "kunci" dan "membuka" untuk mencapai pengecualian bersama? Bagaimana cara mengunci / membuka kunci?
Output dari program berikut ini hanya "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];
}
lockobjek dibuat pada setiap panggilan, sehingga tidak akan pernah ada kasus di mana satu @synchronizedblok kunci keluar lain. Dan ini berarti tidak ada pengecualian yang saling menguntungkan.) Tentu saja, contoh di atas sedang melakukan operasi main, jadi toh tidak ada yang harus dikecualikan, tetapi kita tidak boleh menyalin secara membabi buta kode itu di tempat lain.