@synchronize是否保护其他对象指向的对象?

时间:2016-02-23 22:10:11

标签: objective-c multithreading cocoa-touch synchronization

例如,假设我们有objectA,它指向ObjectB,它指向objectC。

然后我们

@synchronized(objectA) {
    [self doSomeStuff];
}

此处受其他线程保护的是什么?只是objectA,或objectB和objectC以及任何对象一直引用的东西?

2 个答案:

答案 0 :(得分:2)

@synchronized(obj) {...}仅表示{...}中的任何内容都不会与任何其他@synchronized(obj)的{​​{1}}同时执行。

即。给出:

主题1:

{...}

主题2:

@synchronized(objectA) {
    [self doSomeStuff];
}

主题3:

@synchronized(objectA) {
    [self doSomeStuff];
}

线程1或线程2中的一个将阻塞,而另一个执行[self doSomeStuff]; ,但线程3将同时快速调用doSomeStuff

并且,更直接地针对您的问题,这意味着,不,对于doSomeStuff可能在内部执行的任何事情,绝对没有并发保护。

如果你希望你的对象是“线程安全的”,它们需要从头到尾设计并考虑并发性(这通常意味着无处不在的大量锁或同步原语)。

答案 1 :(得分:1)

@synchronized(objectA)创建了关键部分。在您的示例中,它保证[self doSomeStuff]不会由不同的线程同时执行。

objectA仅用于标识将使用哪个隐式创建的递归锁。由@synchronized指令创建的关键部分与参数相同的对象不会同时执行。

来自Apple文档:

  

@synchronized指令是创建互斥锁的便捷方法   在Objective-C代码中动态实现。 @synchronized指令执行什么操作   任何其他互斥锁都可以做 - 它可以防止不同的线程   同时获得相同的锁。但是,在这种情况下,你   不必直接创建互斥锁或锁定对象。相反,你   只需使用任何Objective-C对象作为锁定令牌

     

传递给@synchronized指令的对象是唯一的   用于区分受保护块的标识符。如果你执行   在两个不同的线程中传递一个不同的对象   对于每个线程上的anObj参数,每个线程都会锁定它   继续处理而不被另一方阻止。如果你通过   然而,在两种情况下都是相同的对象,其中一个线程会   首先获得锁定,另一个锁定直到第一个   线程完成了关键部分。