原子访问(Atomic Access)
来源:互联网 发布:程序员创业知乎 编辑:程序博客网 时间:2024/05/05 22:49
在编程中,原子动作是一个突然有效地发生。一个原子动作在中途是不能停止的:要不完全执行完,要不一点也不执行。直到原子操作完全执行,它的副作用才会可见。
我们已经看见了自增长表达式,比如c++,不描述一个原子操作。甚至非常简单的表达式可以定义复杂的动作,可以分解为其他的动作。可是,有些动作你可以指定为原子的:
1 引用变量和大多数基本数据类型(除了long和double)的读写是原子的
2 所有声明为volatile字段的变量读写是原子的(包括long和double)
原子动作不能交叉,这样它们就不必担心使用时遇到线程争用了。可是,这不能完全消除同步原子动作,因为内存一致性错误仍然存在。使用volatile变量减少了这方面的风险。因为一个写volatile变量和随后的变量读建立了一个happens-before关系。这就意味着一个volatile变量的变化对其他线程是可见的。更多的,当线程读volatile变量时,它看见的不仅是volatile的最近的变化,还有导致变化的代码的副作用。
虽然使用简单的原子变量访问比通过Synchronized代码访问更加高效,但是需要程序员更多关注避免内存一致性错误。额外的努力是否值得取决于应用程序的规模和复杂性。
java.util.Concurrent包中一些类提供了不依赖Synchronization的原子方法。我们将在高等级并发中讨论。
我们已经看见了自增长表达式,比如c++,不描述一个原子操作。甚至非常简单的表达式可以定义复杂的动作,可以分解为其他的动作。可是,有些动作你可以指定为原子的:
1 引用变量和大多数基本数据类型(除了long和double)的读写是原子的
2 所有声明为volatile字段的变量读写是原子的(包括long和double)
原子动作不能交叉,这样它们就不必担心使用时遇到线程争用了。可是,这不能完全消除同步原子动作,因为内存一致性错误仍然存在。使用volatile变量减少了这方面的风险。因为一个写volatile变量和随后的变量读建立了一个happens-before关系。这就意味着一个volatile变量的变化对其他线程是可见的。更多的,当线程读volatile变量时,它看见的不仅是volatile的最近的变化,还有导致变化的代码的副作用。
虽然使用简单的原子变量访问比通过Synchronized代码访问更加高效,但是需要程序员更多关注避免内存一致性错误。额外的努力是否值得取决于应用程序的规模和复杂性。
java.util.Concurrent包中一些类提供了不依赖Synchronization的原子方法。我们将在高等级并发中讨论。
0 0
- 原子访问(Atomic Access)
- 原子访问(Atomic Access)
- The Java™ Tutorials — Concurrency :Atomic Access 原子访问
- 原子操作(Atomic)
- 原子操作atomic
- java Atomic原子性
- 原子操作(atomic operation)
- Atomic Variables 原子变量
- Atomic Variables 原子变量
- atomic 原子操作练习
- java Atomic原子更新
- sync/atomic - 原子操作
- 原子操作(atomic operation)
- CUDA atomic原子操作
- CUDA atomic原子操作
- GCC原子操作(Atomic Builtins)
- 原子操作(atomic operation)
- 原子操作(atomic operation)
- asp.net mvc 的webApi (一)自己手动创建
- 内在锁和同步
- 【剑指offer】面试题24:二叉搜索树的后续前序遍历序列
- 深刻理解Nginx之Nginx与Python(1)
- 在VS2005中添加成员变量
- 原子访问(Atomic Access)
- nand2tetris【5】
- Java 多线程第二部分
- 软件设计原则总结
- 在linux系统中搭建测试环境 jdk,tomcat,mysql安装
- 发掘数组下标从0开始的缘由
- 加速度计和陀螺仪的区别
- js即可手动输入又可下拉选择
- 面试题总结