什么是原子性?

深入理解阅读:iOS多线程到底不安全在哪里?
原子:

原子(atom)指化学反应不可再分的基本微粒,原子在化学反应中不可分割

原子性:

原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分。将整个操作视作一个整体是原子性的核心特征。 举例:https://zhidao.baidu.com/question/35959124.html

我的理解:

原子是化学中最小的成分,不可再分割。在程序中,我们称不能够进行分割的操作具备原子性,也就是这个操作是一个整体,不可被打断,在执行这个操作时,如果有别的行为发生,必须等待这个操作结束才能够再进行

atomic

1,声明为 atomic 的属性的getter方法和setter方法会通过锁定机制来确保其操作的原子性。因此,在重写了getter方法或setter方法后,即使我们声明的属性是atomic的,重写后的getter方法或setter方法将变成非原子性的 2,atomic属性内部的锁称为 自旋锁 3,凡是线程安全的对象,内部肯定会加锁

注:

如果没有声明为 nonatomic ,则默认为 atomic

自旋锁和互斥锁

相同点:都能保证同一时间只有一个线程访问共享资源。都能保证线程安全。 不同点: 互斥锁:如果共享数据已经有其他线程加锁了,线程会进入休眠状态等待锁。一旦被访问的资源被解锁,则等待资源的线程会被唤醒。 自旋锁:如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。

自旋锁的效率高于互斥锁

atomic与nonatomic:

atomic:原子操作,属于默认值。在多线程环境中,把方法设定为原子操作,可以提供可靠的属性存取方法。 nonatomic:非原子操作,会简单的操作属性值。可以加快属性值存取的速度

atomic的作用:

参考:[OC]之 atomic 与 nonatomic的区别

atomic能够保证读写(即getter方法和setter方法)安全 如果不加锁的话(或者说使用nonatomic语义),那么当其中一个线程正在改写某属性值的时候,另外一个线程也许会突然闯入,把尚未修改好的属性值读取出来。发生这种情况时,线程读取到的属性值可能不对。 而atomic能够确保写入行为的过程中不会被读取,读取操作会进行等待,在写入完成后执行,确保读取到正确的属性值

atomic是否是线程安全的?

1,atomic的安全性只是针对getter方法和setter方法的,对于 NSMutableArray 对象,即使使用了 atomic,也是线程不安全的(NSMutableArray 并不是通过getter和setter读写的) 2,多线程中,程序还能够执行读写(getter和setter)之外的操作,因此并不能保证线程的安全性

iOS开发中不使用atomic的原因

一般iOS程序中,所有属性都声明为nonatomic。这样做的原因是: 在iOS中使用同步锁的开销比较大, 这会带来性能问题。一般情况下并不要求属性必须是“原子的”,因为这并不能保证“线程安全”(thread safety),若要实现“线程安全”的操作,还需采用更为深层的锁定机制才行。

例如:一个线程在连续多次读取某个属性值的过程中有别的线程在同时改写该值,那么即便将属性声明为atomic,也还是会读取到不同的属性值。

因此,iOS程序一般都会使用nonatomic属性。但是在Mac OS X程序时, 使用atomic属性通常都不会有性能瓶颈

results matching ""

    No results matching ""