JAVA 并发编程实践 - 原子变量与非阻塞同步机制 笔记

大兔子大兔子 提交于 2019-12-06 12:30:06

非阻塞算法: 利用底层的源自机器指令(比如CAS)代替锁来实现数据在并发访问中的一致性。应用于:操作系统和JVM中实现线程/进程调度机制,垃圾回收机制以及锁和其他并发数据结构。

与基于锁的方案相比, 非阻塞算法实现复杂,但是可伸缩性和活跃性拥有优势,多线程竞争相同数据的情况下不用阻塞,可以在更细的类度上进行协调, 减少调度开销, 在非阻塞算法中不存在死锁和活跃性问题。

原子变量提供了与volatile相同的内存语义, 同时支持原子操作, 比基于锁的操作更有可伸缩性。

锁的劣势:竞争锁的线程会挂起和恢复线程, 这样调度和开销会比较大。

Volatile是更轻级别的同步机制,在使用时不会发生上下文切换或者线程调度,但是volatile不能保证构建原子的复合操作,当一个变量依赖于其他变量或者当变量的新值依赖于旧值时, 就不能使用volatile变量。所以不能用来实现计数器和互斥体(mutex).

所得缺点还有线程在等待锁时不能做其他的事情, 这样多线程等待锁时,等待线程被阻塞。如果持有锁的线程优先级别低而请求所得线程优先级别高就会发生优先级别翻转(Priovrity Inversion).

JVM对CAS的支持

JAVA5.0之前如果不明确编码,是不能够调用CAS的, 在Java5.0后,引入了底层的支持, 在int, long和对象的引用等类型上都公开了CAS操作,并且便以为底层的硬件提供的最有效的方法, 原子变量类正是利用了这种功能来实现的。

 原子变量类是一种泛化的volatile变量,能够支持原子的和有条件的读-改-写操作。原子变量类有:AtomicInteger, AtomicLong, AtomicBoolean以及AtomicReference.


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!