例如,假设我们有objectA,它指向ObjectB,它指向objectC。
然后我们
@synchronized(objectA) {
[self doSomeStuff];
}
此处受其他线程保护的是什么?只是objectA,或objectB和objectC以及任何对象一直引用的东西?
答案 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参数,每个线程都会锁定它 继续处理而不被另一方阻止。如果你通过 然而,在两种情况下都是相同的对象,其中一个线程会 首先获得锁定,另一个锁定直到第一个 线程完成了关键部分。