Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c @synchronized是否阻止整个线程_Objective C_Xcode4.3_Grand Central Dispatch_Synchronized - Fatal编程技术网

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
   }
});
如果您可以将您试图保护的对象用作锁定对象