@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];
}
locktượ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 @synchronizedkhố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.