非阻塞同步机制

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操作