क्या @synchronized पारस्परिक बहिष्करण प्राप्त करने के लिए "लॉक" और "अनलॉक" का उपयोग नहीं करता है? यह तब लॉक/अनलॉक कैसे करता है?उद्देश्य-सी में @ सिंक्रनाइज़ लॉक/अनलॉक कैसे करता है?
निम्नलिखित प्रोग्राम का आउटपुट केवल "हैलो वर्ल्ड" है।
@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];
}
नोट: http://stackoverflow.com/questions/1215765/ –
से संबंधित यदि आपको इसकी आवश्यकता नहीं है तो आपको इनिट को ओवरराइड करने की आवश्यकता नहीं है। यदि आप किसी विधि को ओवरराइड नहीं करते हैं तो रनटाइम स्वचालित रूप से सुपरक्लास 'कार्यान्वयन को कॉल करता है। –
ध्यान देने योग्य एक महत्वपूर्ण बात यह है कि उपरोक्त कोड सिंक्रनाइज़ नहीं है। प्रत्येक कॉल पर 'लॉक' ऑब्जेक्ट बनाया गया है, इसलिए ऐसा कोई मामला कभी नहीं होगा जहां एक '@ सिंक्रनाइज़' ब्लॉक दूसरे को लॉक कर देगा। और इसका मतलब है कि कोई पारस्परिक बहिष्कार नहीं है।) बेशक, उपरोक्त उदाहरण 'मुख्य' में ऑपरेशन कर रहा है, इसलिए किसी भी तरह से बाहर निकलने के लिए कुछ भी नहीं है, लेकिन किसी को उस कोड को कहीं और कॉपी नहीं करना चाहिए। –