美文网首页
atomic和线程安全的理解

atomic和线程安全的理解

作者: Corbin___ | 来源:发表于2020-02-29 22:23 被阅读0次

atomic和线程安全的理解

线程安全

如果多线程下,一直操作i = i + 1,可能出现线程不安全

i = i + 1这个表达式涉及三步,取值,修改,赋值;

例如i = 1,线程A这时候进行i = i + 1,先取值,在修改(i+1)的过程中,这时候线程B进来了,他也要执行i = i + 1,他也先取值i,这时候i还是等于1

线程A执行完,i=2,

线程B执行完,i=2

我们是执行了两次i = i + 1如果线程安全的话,这时候i应该等于3

那么我们要怎么改成线程安全呢,就是对操作加锁i = i + 1

这样当线程A执行i = i + 1这个代码的时候,因为被加锁了,线程B只能等待,直到线程A执行完

atomic为啥线程不安全

atomicsetget方法内加锁,其实他跟线程安全都不搭边

如果要举个例子的话,刚才i = i + 1这个例子,就算是atomic修饰i属性,那么也是线程不安全的

以前我对线程安全概念一直懵了,一直纠结

无论怎么加锁

线程A 读

线程B 写

线程C 读

线程D 写

好像对读写加锁,都没法解决最后数据不对的问题

后来才明白,如果我们将一个操作,比如读写一起加锁,那么就线程安全了

很难描述这个情况,不知道大家有没有get到我的点,大概意思就是atomic是读写方法加锁,但是真的要做到线程安全,应该是这一系列的操作加锁


看完这个文章iOS多线程到底不安全在哪里?的一些补充,记录

原子性:

原子性能保证代码串行的执行,能保证代码执行到一半的时候,不会有另一个线程介入。

原子性是个相对的概念,它所针对的对象,粒度可大可小。

线程安全

多线程访问时出现意料之外的结果

内存访问

在文章中说到,内存的访问是串行的,当我看到这个的时候,我就想,是串行的,那么怎么还有多线程安全问题。

其实问题在于,原子性和线程安全的理解,在我们的代码中,想要线程安全,应该是一系列的操作是原子性的,例如i = i + 1这个操作是原子性的,那么去内存中读数据,写数据的顺序不会被其他线程的操作插入,导致出现意料之外的结果

如何用Xcode8解决多线程问题
其中讲了四个多线程不安全的场景,em。。。。还不错可以记着

相关文章

  • atomic和线程安全的理解

    atomic和线程安全的理解 线程安全 如果多线程下,一直操作i = i + 1,可能出现线程不安全 i = i ...

  • nonatomic和atomic的区别

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

  • 题库整理(一)

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

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

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

  • atomic和nonatomic区别

    atomic 默认为atomic,原子性的(最小单位),表示线程安全的,在多线程中,其保证了setter和gett...

  • 原子属性

    非原子属性nonatomic 和原子属性atomic 原子属性atomic:就是为了保证这个属性的安全性(线程安全...

  • 出一套:iOS中高级面试题

    iOS基础 1:讲讲你对atomic & nonatomic的理解 1、原子操作对线程安全并无任何安全保证。被 a...

  • atomic 和 nonatomic的区别

    首先atomic 和 nonatomic 都不能保证线程的安全性;atomic:如果我们对属性 不设置atomi...

  • atomic与线程安全

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

  • iOS编程中atomic和nonatomic的区别

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

网友评论

      本文标题:atomic和线程安全的理解

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