Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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 block中传递self?_Objective C_Ios_Macos_Synchronization_Block - Fatal编程技术网

Objective c 为什么在@synchronized block中传递self?

Objective c 为什么在@synchronized block中传递self?,objective-c,ios,macos,synchronization,block,Objective C,Ios,Macos,Synchronization,Block,我猜@synchronized块不是对象相关的,而是线程相关的……对吗?在这种情况下,我们为什么要传递self?传递的对象用于区分哪些@synchronized块对应于彼此锁定。使用self通常很方便,但如果您只想同步更小、更具体的代码部分(例如,同步对特定NSMutableDictionary的所有访问,而不是同步整个实例中的所有内容),则有时最好使用其他对象 我不知道你所说的“线程相关”是什么意思。@synchronized的目的是针对可能在不同线程上运行的代码块,您需要确保在任何时候只运行

我猜@synchronized块不是对象相关的,而是线程相关的……对吗?在这种情况下,我们为什么要传递self?

传递的对象用于区分哪些
@synchronized
块对应于彼此锁定。使用
self
通常很方便,但如果您只想同步更小、更具体的代码部分(例如,同步对特定
NSMutableDictionary
的所有访问,而不是同步整个实例中的所有内容),则有时最好使用其他对象


我不知道你所说的“线程相关”是什么意思。
@synchronized
的目的是针对可能在不同线程上运行的代码块,您需要确保在任何时候只运行1次,而不重叠。对于执行非线程安全的操作(例如,更改集合)非常重要。

@synchronized
是语言提供的用于创建同步作用域的构造。由于使用简单的全局共享互斥锁会非常低效,从而序列化应用程序中的每个
@synchronized
作用域,因此该语言允许我们指定一个同步点

然后由开发人员决定哪些同步点适合于该任务

在实例方法上,使用self是常见的:实例是同步点。
@synchronized(self)
作用域可以在任意数量的实例上调用,但对于给定实例只能调用一次。对于给定实例,每个
@synchronized(self)
作用域都将被序列化


当然,如果您愿意,您可以自由地使用另一个同步点。您可以使用类(
@synchronized(self.class)
)或任何其他适合您需要的工具。

我怀疑这种做法,因为它是一种错误。问题的关键在于,其他人也可能对您的对象进行
同步
,这可能会导致死锁和其他问题,而这些问题在您使用私有对象进行锁定时是不会出现的。例如:

@implementation foo
-(void) bar
{
    @synchronized(self) {
        @synchronized(sharedLock) {
            //do something
        }
    }
}

Foo* foo = [[Foo alloc] init];
@synchronized(sharedLock) {
    @synchronized(foo) {
         //do something
    }
}

//in another thread
[foo bar];

哦,是的,这是一个打字错误。当我把其他的都修好的时候,我一定错过了:)谢谢!我需要确切知道的是@synchronized(self)与@synchronized(self.class)有何不同?我从您的语句中了解到的是,当我们用@synchronized(self)锁定一个块时,它确保没有两个线程会对一个对象运行该块。当我们使用@synchronized(self.class)时,它将确保没有两个线程针对该类的任何对象运行该块。我说得对吗?