我正在将一些线程安全代码从@synchronized
转换为NSRecursiveLock
。
请考虑myItemsArray
为NSMutableArray
:
- (NSUInteger) numberOfItems {
@synchronized(self.myItemsArray) {
return self.myItemsArray.count;
}
}
我认为以下代码不正确,因为锁永远不会解锁:
- (NSUInteger) numberOfItems {
[self.myRecursiveLock lock];
return self.myItemsArray.count;
[self.myRecursiveLock unlock];
}
所以我正在使用这种方法:
- (NSUInteger) numberOfItems {
[self.myRecursiveLock lock];
NSUInteger itemCount = self.myItemsArray.count;
[self.myRecursiveLock unlock];
return itemCount;
}
但是,我认为这种方法会破坏线程的安全性,因为另一个线程可以在调用 -unlock
之后添加或删除项目,但之前 {返回{1}}。
我不确定我是否认为最后一种方法不是线程安全的,因为我在许多广泛使用的第三方库中看到了这种模式(例如,[AFHTTPRequestOperation -responseObject]
)
从使用itemCount
同步的方法返回值的正确方法是什么?
答案 0 :(得分:1)
保护numberOfItems
永远无法确保计数是最新的。方法返回后,阵列可能会被另一个线程修改。它只能防止两个线程同时调用count
方法。