原子访问(Atomic Access)
2016-07-05 23:38
387 查看
在编程中,原子操作是指在一次发生中生效。一个原子操作不能在中途停止:它要么完整发生,要么不发生。没有副作用的原子操作是可见的,直到完成。
我们见过自增表达式了,如c++,并不是原子操作,甚至非常简单的表达式会定义复杂的操作,这些可以被分解为其它的操作。有一些操作可以确认是原子操作,如:
对引用类型变量和大部分基本类型变量(除long和double)的读、写是原子的
所有声明为volatile变量的读和写都是原子的
原子操作不会被交错,所以不用担心使用他们时发生线程冲突。然而,这并不能消除所有原子操作同步的需求,因为内存一致性错误还是会发生,使用volatile变量可以降低内存一致性错误发生的风险,因为任何对volatile变量写操作都会和后续读操作建立现行发生行为关系。甚至,它还意味着当一个线程读一个volatile变量,它看到的不仅仅是最新的变化,而且看到引发变化代码的负作用。
使用简单原子变量访问比通过同步代码块访问这些变量更高效,但是需要程序员更加仔细以防止内存一致性错误发生,是否值得花费精力依赖于应用规模和复杂度。
在java.util.concurrent包中的一些类提供了原子方法,不在依赖同步方法,我们将会在高级并发章节讨论。
我们见过自增表达式了,如c++,并不是原子操作,甚至非常简单的表达式会定义复杂的操作,这些可以被分解为其它的操作。有一些操作可以确认是原子操作,如:
对引用类型变量和大部分基本类型变量(除long和double)的读、写是原子的
所有声明为volatile变量的读和写都是原子的
原子操作不会被交错,所以不用担心使用他们时发生线程冲突。然而,这并不能消除所有原子操作同步的需求,因为内存一致性错误还是会发生,使用volatile变量可以降低内存一致性错误发生的风险,因为任何对volatile变量写操作都会和后续读操作建立现行发生行为关系。甚至,它还意味着当一个线程读一个volatile变量,它看到的不仅仅是最新的变化,而且看到引发变化代码的负作用。
使用简单原子变量访问比通过同步代码块访问这些变量更高效,但是需要程序员更加仔细以防止内存一致性错误发生,是否值得花费精力依赖于应用规模和复杂度。
在java.util.concurrent包中的一些类提供了原子方法,不在依赖同步方法,我们将会在高级并发章节讨论。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树