多线程并发编程之原子变量与非阻塞同步机制
来源:互联网 发布:考古学禁区 知乎 编辑:程序博客网 时间:2024/06/11 18:39
1.非阻塞算法
非阻塞算法属于并发算法,它们可以安全地派生它们的线程,不通过锁定派生,而是通过低级的原子性的硬件原生形式 —— 例如比较和交换。非阻塞算法的设计与实现极为困难,但是它们能够提供更好的吞吐率,对生存问题(例如死锁和优先级反转)也能提供更好的防御。使用底层的原子化机器指令取代锁,比如比较并交换(CAS,compare-and-swap).
2.悲观技术
独占锁是一种悲观的技术.它假设最坏的情况发生(如果不加锁,其它线程会破坏对象状态),即使没有发生最坏的情况,仍然用锁保护对象状态.
3.乐观技术
依赖冲突监测.先更新,如果监测发生冲突发生,则放弃更新后重试,否则更新成功.现在处理器都有原子化的读-改-写指令,比如比较并交换(CAS,compare-and-swap).
4.CAS操作
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。CAS典型使用模式是:首先从V中读取A,并根据A计算新值B,然后再通过CAS以原子方式将V中的值由A变成B(只要在这期间没有任何线程将V的值修改为其他值)。
清单 3. 说明比较并交换的行为(而不是性能)的代码
public class SimulatedCAS { private int value; public synchronized int getValue() { return value; } public synchronized int compareAndSwap(int expectedValue, int newValue) { int oldValue = value; if (value == expectedValue) value = newValue; return oldValue; }}
清单 4. 使用比较并交换实现计数器
public class CasCounter { private SimulatedCAS value; public int getValue() { return value.getValue(); } public int increment() { int oldValue = value.getValue(); while (value.compareAndSwap(oldValue, oldValue + 1) != oldValue) oldValue = value.getValue(); return oldValue + 1; }}
5.原子变量
原子变量支持不用锁保护就能原子性更新操作,其底层用CAS实现。共有12个原子变量,可分为4组:标量类、更新器类、数组类以及复合变量类。最常用的原子变量就是标量类:AtomicInteger、AtomicLong、AtomicBoolean以及AtomicReference。所有类型都支持CAS。
6.性能比较:锁与原子变量
在中低程度的竞争下,原子变量能提供很高的可伸缩性,原子变量性能超过锁;而在高强度的竞争下,锁能够更有效地避免竞争,锁的性能将超过原子变量的性能。但在更真实的实际情况中,原子变量的性能将超过锁的性能。
- 多线程并发编程之原子变量与非阻塞同步机制
- 《Java并发编程实战》---性能与可伸缩性---原子变量与非阻塞同步机制
- 《Java并发编程实战》第十五章 原子变量与非阻塞同步机制 读书笔记
- 《JAVA并发编程实战》 - 原子变量与非阻塞同步机制
- java并发编程实践学习(15)原子变量与非阻塞同步机制
- 并发编程实战学习笔记(十一)-原子变量与非阻塞同步机制
- java并发编程实战-原子变量与非阻塞同步机制
- Java并发编程实战(学习笔记 十四 第十五章 原子变量与非阻塞同步机制)
- Java并发:原子变量和非阻塞同步机制
- 读书笔记:Java并发实战第15章 原子变量与非阻塞同步机制
- 原子变量和非阻塞同步机制
- java并发编程4:原子变量与非阻塞算法
- 并发编程14-非阻塞同步机制
- [Java Concurrency in Practice]第十五章 原子变量与非阻塞同步机制
- Java的多线程之同步篇三:同步阻塞、监视器、volatile、final、原子性、线程局部变量、锁测试与超时、读写锁
- 并发 并行 同步 异步 多线程 阻塞 非阻塞的区别
- 并发 并行 同步 异步 多线程 阻塞 非阻塞的区别
- 并发 并行 同步 异步 多线程 阻塞 非阻塞的区别
- Python--ZOJ1115 and ZOJ1151
- 感言
- Cocos2d-x 3.0final 终结者系列教程21ScrollView原理与使用
- Windows 2008 修改密码策略
- 百度地图开发(四)之POI检索
- 多线程并发编程之原子变量与非阻塞同步机制
- menuItem类
- Feekood开发环境介绍(4)-- 脚本编辑器
- cocos2d-x3.2场景切换
- java MD5加密
- Cocos2d-x3.3 Physics物理引擎模块解决了刚体穿透问题
- CocoStudio1.6UI编辑器动画播放
- Codeforces Round #294 (Div. 2) C
- 【Cocos2d-x】音量滑动设定以及自动保存功能实现(完整模块)