原子性

308 阅读3分钟

原子性

举个例子:

A要从自己账户中转¥1000到B的账户。从A开始转账到转账结束的之一过程,称之为一个事务(为了完成某个目的而对系统进行的一组操作)。在这个事务中,要做如下操作:

  1. 从A的账户中减去¥1000,A原有2000,现在变成1000;
  2. 在B的账户中加1000,B原有3000,现在变成4000。

如果在第一步完成后,忽然发生意外,导致转账事务意外终止了,此时A账户已经减少1000,而B中还没有增加1000。操作失败了,则需要进行回滚(回滚就是回到事务开始之前的状态:A:2000 B:3000)。

这种,完成事务的一组操作要么一起全部执行完成提交,要么一起失败(回滚到原状态)的特性叫做事务的原子性。 因此说一个事务是原子性的,说明它是一个完整的操做,即在执行中不可以被中断(像是多线程操作中,等待资源时,线程被挂起,记录上下文下次执行是不可以的)。

数据库中所说的事务就是对数据库中数据的操做过程,而在程序中所说的事务就是指对内存中数据的操做过程。

综上可以得出原子操作的定义:

原子操作

是指不会被线程调度机制打断的操做。这种操做一旦开始,就一直运行到结束,中间不会有任何的context switch。

原子操作可以是一个步骤,也可以是多个操做步骤,但是其顺序不可打乱,也不可被切割而只执行其中某些部分。将整个操做视为一个不可分割的整体是原子性的核心特征。

例如:在Java中给非long和double的基础数据类型的赋值操作:int a = 25;

如何实现操做的原子性

相关文章:blog.csdn.net/xuxile/arti…

iOS中的属性的原子性

声明属性时,设置属性的原子性atomic和非原子性nonatomic。

atomic:是指属性的getter/setter方法是一个原子操作,如果多线程同时调用setter时,不会出现某个线程还未执行完setter所有语句,另一个线程就又开始执行setter的情况。相当于系统对函数加了锁,这样的话并发访问时性能会比较低,且耗费资源。

nonatomic:一般不需要多线程访问属性时使用,效率更高。OC中属性通常设置为非原子性,因为在iOS程序启动时,系统会自动生成一个单一的主线程,程序执行过程中一般情况下也都是一个线程在对属性进行操作。

当在程序中我们确定某一个属性会在多线程中被使用,并且需要做数据同步时,就必须设置成原子性的,但也可以设置成非原子性的,然后自己在程序中用加锁之类的来做数据同步。

原子操作在多线程中时线程安全的,无需考虑同步的问题。