Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C@同步对象更改_Objective C_Synchronization_Synchronized - Fatal编程技术网

Objective-C@同步对象更改

Objective-C@同步对象更改,objective-c,synchronization,synchronized,Objective C,Synchronization,Synchronized,我非常喜欢@synchronized构造,而不是使用NSLocks,因为我希望一个数据结构一次只能由一个线程读取或写入。但是,当我想更改我们正在@synchronization上的整个对象时,我不确定@synchronized是否合适。我想知道的是,它们是否以同样的方式工作: // version 1: // segment 1: @synchronized(self.obj) { self.obj = obj2; } // segment 2: @synchronized(self.

我非常喜欢@synchronized构造,而不是使用NSLocks,因为我希望一个数据结构一次只能由一个线程读取或写入。但是,当我想更改我们正在@synchronization上的整个对象时,我不确定@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];

一个
NSLock
和一个
@synchronized
调用基本上是一样的,并且几乎可以互换。这里有一些细微的差别,对于这样一个简单的实现,您可能不需要关心这些差别,但是请仔细阅读它们,因为它有点有趣


这里有一个比较这两者的很好的SO答案:

相反,您可以在不使用
非原子
的情况下设置属性。没有
非原子的
意味着它是
原子的

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

有关更多信息,请参阅的可能重复