当前位置: 首页 > news >正文

iOS 中,Atomic 修饰 NSString、 NSArray,也会线程不安全

众所周知,基础类型如 int、float 的变量被 atomic 修饰后就具有原子性,则线程安全。

然而有些情况,atomic 修饰后不一定是线程安全的。

atomic 修饰 NSString,NSArray 的时候,只是保障首地址(数组名)原子性,而首地址指向的是一整片内存空间。若多线程 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);
}
http://www.lryc.cn/news/195955.html

相关文章:

  • 2023医药微信公众号排名榜top100汇总合集
  • 基于YOLO算法的单目相机2D测量(工件尺寸和物体尺寸)三
  • Cython编译文件出错
  • WPF 用户控件依赖注入赋值
  • leetcode-48.旋转图像
  • antd的RangePicker设置默认值,默认近七天(andt+react)
  • 大数据可视化模块竞赛Vue项目文件结构与注意事项
  • 户外运动盛行,运动品牌如何利用软文推广脱颖而出?
  • 2024年孝感市建筑类中级职称申报资料私企VS国企
  • OpenResty安装
  • 通过stream对list集合中对象的多个字段进行去重
  • 招投标系统软件源码,招投标全流程在线化管理
  • css设置文本溢出隐藏...
  • 【小尘送书-第八期】《小团队管理:如何轻松带出1+1>2的团队》
  • 【网络协议】聊聊ifconfig
  • python项目之AI动物识别工具的设计与实现(django)
  • 全流量安全分析发现内部系统外联异常
  • Edge---微软浏览器-兼容性问题-解决办法(详细)
  • for循环遍历的`form表单组件`rules规则校验失效问题——下拉框选择之后还是报红---亲测有效
  • 【Python数据分析工具】
  • Python数据挖掘入门进阶与实用案例:自动售货机销售数据分析与应用
  • 2.3_9吸烟者问题
  • 位运算基础知识及性质(精简总结)
  • 阵列信号处理_对比常规波束形成法(CBF)和Capon算法
  • 通过循环生成多个echarts图表并实现自适应
  • MySQL——六、库表操作(下篇)
  • 自动化办公篇之python批量改名
  • Android MediaCodec将h264实时视频流数据解码为yuv,并转换yuv的颜色格式为nv21
  • Postgresql SQL 字段拼接
  • MySQL 迁移完不能快速导数据了?