@Synyncized không sử dụng "khóa" và "mở khóa" để đạt được loại trừ lẫn nhau? Làm thế nào để nó khóa / mở khóa sau đó?
Đầu ra của chương trình sau chỉ là "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];
}
lock
tượng được tạo trên mỗi cuộc gọi, vì vậy sẽ không bao giờ xảy ra trường hợp một @synchronized
khối khóa một khối khác. Và điều này có nghĩa là không có loại trừ lẫn nhau.) Tất nhiên, ví dụ trên đang thực hiện thao tác main
, vì vậy dù sao cũng không có gì để loại trừ, nhưng người ta không nên sao chép mã đó ở nơi khác.