为什么我们在@synchronized块中传递self?

我猜@synchronized块不是对象依赖,但线程依赖…对吗? 那么为什么我们要过自我?

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

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

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

当然,如果你想这样做,你可以自由地使用另一个同步点。 你可以使用类( @synchronized(self.class) )或其他任何适合你的需求。

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

我不确定你的意思是“线程依赖”。 @synchronized的用途是针对可能在不同线程上运行的代码块,并且您需要确保在任何时候只运行1次,而不会重叠。 对于执行非线程安全的操作(例如,比如改变集合)非常重要。

我质疑这种做法,因为它是其他语言中已知的反模式 。 问题的关键是别人也可以synchronize你的对象,可能会导致死锁和其他问题,如果你使用一个私人NSObject的锁。 例如:

 @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];