我想@Synchronized块不反对依赖,但依赖线程...对吧? 在这种情况下,为什么我们通过自我?
Answer 1:
@synchronized
是通过创建同步范围的语言提供的构建体。 因为这将是非常低效使用一个简单的全局共享互斥体,从而序列化每一个@synchronized
的应用范围,语言允许我们指定一个同步点。
然后,它是由开发(或多个)来决定哪个同步点适合的任务。
上一个实例方法,使用自常见:实例是同步点。 该@synchronized(self)
范围可以叫上任意数量的实例,但只有一次给定实例。 每@synchronized(self)
范围将被序列化给定实例。
当然,你可以自由,如果你想这样做使用另一个同步点。 您可以使用类( @synchronized(self.class)
或其他任何适合您的需求。
Answer 2:
传入的对象用于区分哪个@synchronized
块对应于锁定彼此。 使用self
往往是方便,但有时它是一个好主意,用一些其他的对象,如果你想只同步较小,更多的代码特定部分(例如,同步所有访问特定NSMutableDictionary
,而不是在整个实例进行同步一切)
我不知道你所说的“线程依赖”的意思。 的目的@synchronized
针对可能在不同的线程运行的代码块,你需要确保只有1个在任何时间运行,没有重叠。 重要的执行是不是线程安全的(如突变的集合,例如)的行为。
Answer 3:
我怀疑这种做法,因为它是一个在其他语言中称为反模式 。 问题的关键是,别人也可以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];
文章来源: Why do we pass self in @synchronized block?