程序的原子性操作

java面试题网站:www.javaoffers.com
作为开发人员经常会用到锁, 因为锁通常来说具有原子性,那原子性又是什么? 有些人说,原子性就是同一个代码块在任何时刻只能被一个线程访问执行,其他线程则等待(阻塞). 细想一下这句话应该属于排它性. 也有人说不可分割就属于原子性.

科普一下知识:

并行: 多个cpu在同一时刻执行各自的多线程
并发: 单个cpu 在同一时间段循环执行多线程
线程: 用来执行具有一系列关联性的操作单元(本质上是机器码, 从编程角度来说就是你的程序代码, 因为程序码最终会编译成机器码)
总线锁: CPU芯片上有一条引线#HLOCK pin,如汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性
原子(atom):指化学反应不可再分的基本微粒,原子在化学反应中不可分割。但在物理状态中可以分割。原子由原子核和绕核运动的电子组成。原子构成一般物质的最小单位,称为元素. 所以原子性通常指不可再分割.计算机中引用了这一概念(毕竟计算机还没出生的时候科学家们已经知道了原子了)叫原子性操作即不可以被分割成为其他子操作.
机器码: 各种用二进制编码方式表示的指令,叫做机器指令码就是机器语言,机器码不易被人们理解和记忆,并且用它编程容易出差错。
汇编语言: 人们用助记符号代替机器指令码而形成了汇编语言,编写程序时依然很繁琐,因此产生了高级语言
高级语言: 最接近人类思维逻辑的语言, 如java,python,scala等属于高级语言,语法很接近人类的语言

计算机中原子操作:

所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程),在计算机中 机器码是属于原子操作.

机器码: 在处理器的单核上, 机器码具有原子性. 随着计算机的不断发展,现在都是多核处理器, 从多核的角度看会出现如下问题:
⒈ CPU A(CPU A上所运行的进程,以下同)从内存单元把当前计数值⑵装载进它的寄存器中;
⒉ CPU B从内存单元把当前计数值⑵装载进它的寄存器中。
⒊ CPU A在它的寄存器中将计数值递减为1;
⒋ CPU B在它的寄存器中将计数值递减为1;
⒌ CPU A把修改后的计数值⑴写回内存单元。
⒍ CPU B把修改后的计数值⑴写回内存单元。
为了保证在多核下机器码的执行也具有原子性的表现形式, 使用了 ‘总线锁’ ,从而保证了在多核处理的情况下不会出现 context switch (切换到另一个线程),
举例: 处理器会自动保证基本的内存操作的原子性。处理器保证从系统内存当中读取或者写入一个字节是原子的,意思是当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址

从(java语言)编程的角度看原子操作:

一行代码最终会被编译成一条或多条机器码(java语言是: 代码 -> 字节码(不同机器上的jvm会将字节码编译成所在机器对应的机器码,因此做到了跨平台运行) -> 机器码), 如果你的代码最终编译为一条机器码指令,则处理器会保证他的原子性, 如果编译成了多条机器码指令,则处理保证不了它的原子性操作.那么我们就需要一些额外的手段来是它成为原子操作, 通常我们用的最多的就是锁这种机制, 例如: synchronized, Lock
, 锁具有排它性(独占性), 即当有一线程获取索后会使其他访问的线程进行等待,直到锁被释放. 因此做到了原子操作的效果, 所以我们说 synchronized, Lock 具有原子性

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值