【问题标题】:Objective-C @synchronized object changesObjective-C @synchronized 对象更改
【发布时间】:2012-02-15 10:58:09
【问题描述】:

当我希望一个数据结构一次只能由一个线程读取或写入时,我真的很喜欢 @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];

【问题讨论】:

标签: objective-c synchronization synchronized


【解决方案1】:

您可以设置不带nonatomic 的属性。没有nonatomic的意思是atomic

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

欲了解更多信息,请参阅Apple documentation

【讨论】:

    【解决方案2】:

    NSLock@synchronized 调用基本相同,并且几乎可以互换。有一些细微的差异,对于如此简单的实现,您可能不需要关心它们 - 但请仔细阅读它们,因为它有点有趣!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2010-11-15
      • 2014-07-25
      • 2021-06-07
      相关资源
      最近更新 更多