网站做次级页面,网站流量所需的成本.,北京高端网页建设,免费发布项目信息的平台众所周知#xff0c;基础类型如 int、float 的变量被 atomic 修饰后就具有原子性#xff0c;则线程安全。
然而有些情况#xff0c;atomic 修饰后不一定是线程安全的。
atomic 修饰 NSString#xff0c;NSArray 的时候#xff0c;只是保障首地址#xff08;数组名…众所周知基础类型如 int、float 的变量被 atomic 修饰后就具有原子性则线程安全。
然而有些情况atomic 修饰后不一定是线程安全的。
atomic 修饰 NSStringNSArray 的时候只是保障首地址数组名原子性而首地址指向的是一整片内存空间。若多线程 A 访问 length 或 count然后线程 B 把数组的元素删去了几个那么待会线程 A 访问就出现了数组越界。
解决方法是对数据结构的 add 和 remove 操作加锁。NSArray 不可修改的话可以继承它自定义带锁的 add 和 remove 方法。现有的实现。SynchronizedArray 就是这样的思路。
property (atomic, strong) NSArray* arr;//thread A
for (int i 0; i 100000; i ) {if (i % 2 0) {self.arr [1, 2, 3];}else {self.arr [1]; // i % 2 为奇数时直接缩短数组长度。}NSLog(Thread A: %\n, self.arr);
}//thread B
for (int i 0; i 100000; i ) {
// 先访问了 count然后被线程 A 打断数组长度被缩减。那么待会回来重新访问的时候就会越界 crash。if (self.arr.count 2) { NSString* str [self.arr objectAtIndex:1];}NSLog(Thread B: %\n, self.arr);
}