探究探究iOS多线程究竟不安全在哪里?多线程究竟不安全在哪里?
iOS多线程安全的概念在很多地方都会遇到,为什么不安全,不安全又该怎么去定义,其实是个值得深究的话
题。那么通过下面这篇文章小编和大家一起来探究了iOS多线程究竟不安全在哪里?需要的朋友可以参考学习。
前言前言
共享状态,多线程共同访问某个对象的property,在iOS编程里是很普遍的使用场景,我们就从Property的多线程安全说起。
Property
当我们讨论property多线程安全的时候,很多人都知道给property加上atomic attribute之后,可以一定程度的保障多线程安
全,类似:
@property (atomic, strong) NSString* userName;
事情并没有看上去这么简单,要分析property在多线程场景下的表现,需要先对property的类型做区分。
我们可以简单的将property分为值类型和对象类型,值类型是指primitive type,包括int, long, bool等非对象类型,另一种是对
象类型,声明为指针,可以指向某个符合类型定义的内存区域。
上述代码中userName明显是个对象类型,当我们访问userName的时候,访问的有可能是userName本身,也有可能是
userName所指向的内存区域。
比如:
self.userName = @"peak";
是在对指针本身进行赋值。而
[self.userName rangeOfString:@"peak"];
是在访问指针指向的字符串所在的内存区域,这二者并不一样。
所以我们可以大致上将property分为三类:
分完类之后,我们需要明白这三类property的内存模型。
Memory Layout
当我们讨论多线程安全的时候,其实是在讨论多个线程同时访问一个内存区域的安全问题。针对同一块区域,我们有两种操
作,读(load)和写(store),读和写同时发生在同一块区域的时候,就有可能出现多线程不安全。所以展开讨论之前,先
要明白上述三种property的内存模型,可用如下图示: