在技术面试中我被问到以下问题让我很困惑:
如果存在由两个不同线程修改的原子NSMutableArray。这种情况有哪些风险?会导致崩溃吗?以及如何避免它们?
有谁能告诉我为什么会有任何风险?原子是线程安全的吗?
由于
答案 0 :(得分:0)
atomic
属性属性不直接引用线程安全性。它指的是编译器将合成ivar和getter / setter方法的事实。例如,如果要提供自己的getter / setter,则将属性标记为nonatomic
,然后编写getter / setting;编译器不会生成ivar。
原子属性突变通常是线程安全的,但这主要是现代CPU的副作用。例如,使用新对象引用设置数组属性通常是线程安全的。换句话说,如果两个线程同时设置一个引用属性,那么一个将成功;你不会得到一个指向空间的奇怪的半参考。
但是,仅仅因为对象的引用是线程安全的,它不会使它引用的对象是线程安全的。
通常,任何可变对象都必须使用信号量或类似技术从多个线程安全地改变其状态(或安排从同一个线程执行所有访问)。
到目前为止,最简单的方法是使用信号量。使用包含信号量的代码环绕或包装任何修改或访问对象的代码,直到操作完成:
@implementation SafeCollection
{
NSLock* collectionLock;
NSMutableArray* collection;
}
- (void)addToCollection:(id)obj
{
[collectionLock lock];
[collection addObject:obj];
[collectionLock unlock];
}
- (id)objectInCollectionAtIndex:(NSUInteger)index
{
[collectionLock lock];
id obj = collection[index];
[collectionLock unlock];
return obj;
}
线程安全性是expansive and complex topic,但尝试操作可变资源的两个线程的基础非常简单。