Objective-C @synchronized对象更改

时间:2012-02-15 10:58:09

标签: objective-c synchronization synchronized

我真的很喜欢@ synchronized-construct而不是使用NSLocks,当我想要一次只能读取或写入一个数据结构时。但是,当我想更改整个对象时,我们是@synchronizing,我不确定@synchronized是否合适。我想知道的是,这些是否以同样的方式运作:

// version 1:

// segment 1:
@synchronized(self.obj) {
    self.obj = obj2;
}
// segment 2:
@synchronized(self.obj) {
    // some other stuff
}

// version 2:
// segment 1:
[objLock lock];
self.obj = obj2;
[objLock unlock];
// segment 2:
[objLock lock];
// some other stuff
[objLock unlock];

2 个答案:

答案 0 :(得分:1)

相反,您可以设置不带nonatomic的属性。缺少nonatomic表示atomic

  

默认情况下,属性是原子的,因此合成访问器提供对多线程环境中属性的强大访问 - 也就是说,无论其他线程同时执行什么,始终完全检索或设置从getter返回的值或通过setter设置的值。

有关详细信息,请参阅Apple documentation

答案 1 :(得分:0)

NSLock@synchronized来电基本相同,几乎可以互换。有一些细微的差别,你可能不需要关心这样一个简单的实现 - 但是要阅读它们,因为它有点有趣!

这里有一个很好的答案,比较两者:How does @synchronized lock/unlock in Objective-C?