原子性和原子性操作

在运维知识学习中,经常涉及到原子性原子性操作的概念,下面就来详细说说。

先看一个例子:

张三银行账号有1000元,李四银行账号有2000元。现在李四需要往张三账号转1000元。

李四银行账号刚转出1000元,设备故障,张三银行账号没有收到1000元汇款。

结果是,李四银行账号1000元,张三银行账号1000元。

上面的例子明显不应该发生,这就需要当设备故障时,李四转出的1000元自动退回账号中。就像没操作之前的一样。

这种要么操作100%完成,要么无操作的特性,就叫做原子性。

而符合原子性的操作就是原子性操作。

时间: 2024-10-09 01:17:53

原子性和原子性操作的相关文章

管道的原子性 linux写操作原子性

从本质上说,管道也是一种文件,但他又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题 限制管道的大小.实际上,管道是一个固定大小的缓冲区.在Linux中该换冲区的大小为一页,4k 使得他的大小不像文件那样不加检验的增长.使用固定缓冲区也会带来问题,比如再写管道时可能变满 当这种情况发生时,随后对管道的write()调用被阻塞,等待某些数据被读取,以便腾出足够的空间供 write()调用. 读取工作也可能比写的进程快.当所有进程的数据被读取完时,一个随后的read()调用将默认的被阻塞

8.volatile原子性

原子性 1.一个操作是不可中断的,即使多个线程在一起执行的时候,一旦操作执行开始,就不会被其他的线程干扰执行并导致执行中断. 2.对于静态变量int ,2个线程同时对它进行修改,线程a对它修改为10,线程b对它修改为15,a.b线程之间是没有干扰的,最后的结果要么是10或者15. 3.非原子性操作时,都会存在线程安全问题,所以需要同步技术synchronized使操作变成原子性,一个操作是原子性操作,那么它就具有原子性. volatile 1.关键字虽然拥有多个线程之间的可见性,但是却不具有同步

并发编程之原子性、可见性、有序性的简单理解

并发程序正确地执行,必须要保证原子性.可见性以及有序性.只要有一个没有被保证,就有可能会导致程序运行不正确. 原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行. 可见性:当多个线程同时访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值. 有序性:程序执行的顺序按照代码的先后顺序执行. 对于单线程,在执行代码时jvm会进行指令重排序,处理器为了提高效率,可以对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证保

Java并发编程三个性质:原子性、可见性、有序性

并发编程 并发程序要正确地执行,必须要保证其具备原子性.可见性以及有序性:只要有一个没有被保证,就有可能会导致程序运行不正确 线程不安全在编译.测试甚至上线使用时,并不一定能发现,因为受到当时的CPU调度顺序,线程个数.指令重排的影响,偶然触发 线程安全的定义 比如说一个类,不论通过怎样的调度执行顺序,并且调用处不用对其进行同步操作,其都能表现出正确的行为,则这个类就是线程安全的 并发编程三个概念 原子性: 一个操作或多个操作要么全部执行且执行过程不被中断,要么不执行 可见性: 多个线程修改同一

为什么volatile能保证有序性不能保证原子性

对于内存模型的三大特性:有序性.原子性.可见性. 大家都知道volatile能保证可见性和有序性但是不能保证原子性,但是为什么呢? 一.原子性.有序性.可见性 1.原子性: (1)原子的意思代表着——“不可分”:(2)在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性.原子性是拒绝多线程交叉操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作.例如 a=1是原子性操作,但是a++和a +=1就不是原子性操作. 2.可见性 线程执行结果在内存中对其它线程的可见

解决原子性问题?脑海中有这个模型就可以了

上一篇文章 可见性有序性,Happens-before来搞定,解决了并发三大问题中的两个,今天我们就聊聊如何解决原子性问题 原子性问题的源头就是 线程切换,但在多核 CPU 的大背景下,不允许线程切换是不可能的,正所谓「魔高一尺,道高一丈」,新规矩来了: 互斥: 同一时刻只有一个线程执行 实际上,上面这句话的意思是: 对共享变量的修改是互斥的,也就是说线程 A 修改共享变量时其他线程不能修改,这就不存在操作被打断的问题了,那么如何实现互斥呢? 锁 对并发有所了解的小伙伴马上就能想到 锁 这个概念

Java内存模型之原子性问题

本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 前言 之前的文章中讲到,JMM是内存模型规范在Java语言中的体现.JMM保证了在多核CPU多线程编程环境下,对共享变量读写的原子性.可见性和有序性. 本文就具体来讲讲JMM是如何保证共享变量访问的原子性的. 原子性问题 原子性是指:一个或多个操作,要么全部执行且在执行过程中不被任何因素打断,要么全部不执行. 下面就是一段会出现原子性问题的代码: pub

【Java并发基础】并发编程bug源头:可见性、原子性和有序性

前言 CPU .内存.I/O设备之间的速度差距十分大,为了提高CPU的利用率并且平衡它们的速度差异.计算机体系结构.操作系统和编译程序都做出了改进: CPU增加了缓存,用于平衡和内存之间的速度差异. 操作系统增加了进程.线程,以时分复用CPU,进而均衡CPU与I/O设备之间的速度差异. 编译程序优化指令执行次序,使得缓存能够得到更加合理地利用. 但是,每一种解决问题的技术出现都不可避免地带来一些其他问题.下面这三个问题也是常见并发程序出现诡异问题的根源. 缓存--可见性问题 线程切换--原子性问

数据库事务的ACID(原子性,一致性,隔离性,持久性)四大特性

我从维基百科翻译的.翻译水平有限: 在计算机科学中,ACID(原子性,一致性,隔离性,持久性)是数据库事务的一组属性,旨在即使在发生错误,断电等情况下也可以确保有效性.在数据库的上下文中,这是指一系列数据库操作,它们可以满足ACID属性(并且可以将这些属性视为对数据的单个逻辑操作)称为事务.例如,从一个银行帐户到另一个银行帐户的资金转移,即使涉及多个更改,例如从一个帐户借记而向另一个帐户贷记,也只是一次交易. 1983年, Andreas Reuter和TheoHärder在吉姆·格雷(Jim