美文网首页
atomic是否是线程安全的?

atomic是否是线程安全的?

作者: 一位想考研的iOS工程师 | 来源:发表于2019-01-09 11:50 被阅读0次

转自今天所看到的答案,赶紧记录下来。

首先结论是atomic是线程安全的,不是网络上流传的非线程安全。

以下是某位网友的答案。


我们知道,在64位的操作系统下,所有类型的指针,包括void * 都是占用8个字节的。超过4个字节的基本类型数据都会有线程并发的问题。

那所有的指针类型都会有这个问题。

以oc 下的 NSArray * 为例子,如果一个多线程操作这个数据,会有两个层级的并发问题

1、指针本身

2、指针所指向的内存 

指针本身也是占用内存的,并且一定是8个字节,第二部分,指针所指向的内存,这个占多少字节就不一定了,有可能非常大,有可能也就1个字节

所以我们考虑NSArray * array 这个数据array 多线程操作的时候,必须分成两部分来描述,一个是&array这个指针本身,另一个则是它所指向的内存 array

大家注意下 &array 和 array 的区别 ,其实不用纠结,你就想象现在有两块内存,一块是8字节,一块n字节,8字节里面放的值,就是n字节内存的首地址,

ok 现在联系上atomic,如果用@property(atomic)NSArray *array 修饰之后,会有什么影响?网上说的很多,不再赘述,我只想从内存的角度来解释这个过程

首先第一点,你要记住,@property(atomic)NSArray *array 其实修饰的是这个指针,也就是这个8字节内存,跟第二部分数据n字节没有任何关系,被atomic 修饰之后,你不可能随意去多线程操作这个8字节,但是对8字节里面所指向的n字节没有任何限制!这就是所有网络上所说的 atomic 不安全的真相 !!!

我们来看一下,这能怪atomic? 本身你修饰的是一个指针,并且atomic 已经完美的履行了它的指责,你现在不可能对这个8字节进行无序的多线程操作,这就够了呀!atomic没有任何鸟问题。有问题的是人,你本身并未对n字节做任何的限制,所以把问题怪罪到atomic 上真的是很不合理。

个人补充:在使用atomic时,会耗费大量的性能,且只能保证线程安全而无法保证程序的一致性,这就是为什么提倡使用nonatomic的原因。

相关文章

  • atomic是否是线程安全的?

    转自今天所看到的答案,赶紧记录下来。 首先结论是atomic是线程安全的,不是网络上流传的非线程安全。 以下是某位...

  • atomic是否线程安全?

    在申明属性的时候默认的是atomic原子性,在使用属性时我们会手动设置noatomic表示非原子性,这样做以提高访...

  • 问题:使用atomic一定是线程安全的吗?

    atomic不是绝对的线程安全。atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的。 ...

  • nonatomic和atomic的区别

    nonatomic:非线程安全 atomic:线程安全 atomic对属性的set 和get方法进行加锁,保证当前...

  • iOS编程中atomic和nonatomic的区别

    atomic atomic 的本意是指属性的存取方法是线程安全(thread safe).但不保证整个对象都是线程...

  • 为什么说atomic是不安全的?

    atomic是否是安全的? 首先要明确的是, 实际上atomic是安全的, 而且是绝对安全的 atomic实际上就...

  • atomic与线程安全

    本篇文章采用的源码是objc4-781版本 使用atomic一定是线程安全的吗? atomic不是绝对的线程安全。...

  • 题库整理(一)

    1.atomic和nonatomic的区别?atomic一定是线程安全的吗?atomic如何实现atomic? a...

  • IOS 原子性和非原子性

    atomic:原子性,只有一个线程可以同时访问实例。atomic 是线程安全的(因为会为setter方法加锁)默认...

  • iOS开发中用到的关键字总结

    1.原子(atomic)跟非原子(non-atomic)属性有什么区别? (1). atomic提供多线程安全。是...

网友评论

      本文标题:atomic是否是线程安全的?

      本文链接:https://www.haomeiwen.com/subject/wuvwrqtx.html