@synchronizedは相互ロックを実現するために「ロック」と「ロック解除」を使用しませんか?では、どのようにしてロック/ロック解除しますか?
次のプログラムの出力は「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
オブジェクトは、その一つのケースがあることは決してないだろう、すべての呼び出しで作成された@synchronized
ブロックは、別のをロックアウトします。そして、これは相互排除がないことを意味します。)もちろん、上記の例はで操作を行っているmain
ため、とにかく除外するものはありませんが、そのコードを他の場所に盲目的にコピーしないでください。