Objective-C@同步对象更改
我非常喜欢@synchronized构造,而不是使用NSLocks,因为我希望一个数据结构一次只能由一个线程读取或写入。但是,当我想更改我们正在@synchronization上的整个对象时,我不确定@synchronized是否合适。我想知道的是,它们是否以同样的方式工作: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.
// 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返回的值总是被完全检索或设置
有关更多信息,请参阅的可能重复