Objective c @synchronized是否阻止整个线程
说你喜欢Objective c @synchronized是否阻止整个线程,objective-c,xcode4.3,grand-central-dispatch,synchronized,Objective C,Xcode4.3,Grand Central Dispatch,Synchronized,说你喜欢 MyLock *lock = [[MyLock new] autorelease]; @synchronized(lock) { NSLog(@"Hello World"); //some very long process } 在主线程中。这是否意味着直到//某个很长的进程完成,主线程才会被锁定?如果其他线程调用 //Update on the main thread dispatch_sync(dispatch_get_main_queue(), ^{
MyLock *lock = [[MyLock new] autorelease];
@synchronized(lock) {
NSLog(@"Hello World");
//some very long process
}
在主线程中。这是否意味着直到//某个很长的进程完成,主线程才会被锁定?如果其他线程调用
//Update on the main thread
dispatch_sync(dispatch_get_main_queue(), ^{
//Do some updates
});
某些更新永远不会被调用?我说的对吗?如果第一个代码段中的代码从未完成,则无论
@synchronized
语句如何,都不会调用第二个代码段。线程被正在执行的代码阻塞。@synchronized
语句用于同步多个线程之间的数据访问,它需要所有参与线程实际使用该语句。它不会“神奇地”锁定对数据结构的访问,除非所有参与线程“同意”
您不会使用@synchronized
来确保在给定(单个)线程上只执行一个方法,无论如何都是这样
为了给您提供一个具体的使用示例,假设您有一个NSMutableArray
,您希望保护它不被同时从不同线程修改(这可能导致数据损坏)。在这种情况下,您可以始终使用相同的锁令牌在@synchronized
块中访问它
例如:
//Thread 1:
@synchronized (myArray) {
[myArray addObject:@"foo"];
}
//Thread 2:
@synchronized (myArray) {
[myArray removeObjectAtIndex:0];
}
这将确保
@synchronized
所包含的代码块永远不会同时执行。当一个线程进入块时,其他线程将等待它完成,但前提是它们也使用相同的@synchronized
语句。如果您忘记在一个线程上使用它,那么在另一个线程上使用它将毫无帮助。简短的回答是否定的。我认为您不理解锁定的概念。您应该阅读有关同步的更多信息,例如:
当您访问要保护的代码时,在任何情况下都必须使用相同的锁定对象(相同的实例!)进行同步。可以将锁定对象存储为类的属性
就你而言:
self.lock = [[MyLock new] autorelease]; //in init method initialize retain or strong lock property
...
@synchronized(self.lock) {
NSLog(@"Hello World");
//some very long process
}
//Update on the main thread
dispatch_sync(dispatch_get_main_queue(), ^{
@synchronized(self.lock) {
NSLog(@"Hello World");
//some very long process
}
});
如果您可以将您试图保护的对象用作锁定对象