Objective c 为什么在@synchronized block中传递self?
我猜@synchronized块不是对象相关的,而是线程相关的……对吗?在这种情况下,我们为什么要传递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
通常很方便,但如果您只想同步更小、更具体的代码部分(例如,同步对特定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)时,它将确保没有两个线程针对该类的任何对象运行该块。我说得对吗?