原子访问

本文深入探讨了原子操作的概念及其在编程中的重要性,包括如何识别原子操作、它们为何不可交错以及如何通过使用volatile变量减少内存不一致错误。同时,文章还提到Java.util.concurrent包中提供的原子方法,以及在不同场景下使用原子访问相较于同步代码的效率考量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


原子访问

编程中,如果一个操作在事实上是一次性完成的,那就称作原子操作。一个原子操作不可以在中间被中断:它要么一次性完成,要么根本就不会发生,在操作完成之前没有任何可见的副作用。

我们已经知道像i++这样的自增操作其实不是一个原子操作,即便是像这么简单的表达式其实是可以被分解为多步的。但是我们的确可以确认一些原子操作:

·        对引用的读和写操作,对大多数基本数据类型的读和写操作(除了long和double以外的所有类型)

·        对定义为volatile的所有字段的读和写操作都是原子的(包括long和double)

 

原子操作是不可交错的,所有不用怕使用它们会发生线程互相干扰(threadinterference)。但这并不意味着原子操作就不用同步了,因为内存不一致错误(memoryconsistency errors)还是有可能的。使用volatile变量可以减少发生内存不一致错误的风险,因为任何对volatile变量的写操作都会建立与后续对同一变量的读操作的“先行发生”(happens-before)关系。也意味着对volatile变量的改变总是对其他线程可见的。而且,这还意味着当一个线程去读一个volatile变量的时候,它不仅能够看到对这个volatile变量的最近的改变,还可以看到产生这个改变的代码起到的副作用(side effects)。

使用原子访问比使用同步代码高效,但是需要编程人员更加小心的去避免内存不一致错误。额外的努力是不是值得取决于应用的大小和复杂程度。

Java.util.concurrent 包中定义的一些类提供了不需要同步的原子方法,在HighLevel Concurrency Objects.一章中将会讨论。



原文出处:http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值