JAVA 并发编程实践 - 原子变量与非阻塞同步机制 笔记
2014-01-21 09:20
1001 查看
非阻塞算法: 利用底层的源自机器指令(比如CAS)代替锁来实现数据在并发访问中的一致性。应用于:操作系统和JVM中实现线程/进程调度机制,垃圾回收机制以及锁和其他并发数据结构。
与基于锁的方案相比, 非阻塞算法实现复杂,但是可伸缩性和活跃性拥有优势,多线程竞争相同数据的情况下不用阻塞,可以在更细的类度上进行协调, 减少调度开销, 在非阻塞算法中不存在死锁和活跃性问题。
原子变量提供了与volatile相同的内存语义, 同时支持原子操作, 比基于锁的操作更有可伸缩性。
锁的劣势:竞争锁的线程会挂起和恢复线程, 这样调度和开销会比较大。
Volatile是更轻级别的同步机制,在使用时不会发生上下文切换或者线程调度,但是volatile不能保证构建原子的复合操作,当一个变量依赖于其他变量或者当变量的新值依赖于旧值时, 就不能使用volatile变量。所以不能用来实现计数器和互斥体(mutex).
所得缺点还有线程在等待锁时不能做其他的事情, 这样多线程等待锁时,等待线程被阻塞。如果持有锁的线程优先级别低而请求所得线程优先级别高就会发生优先级别翻转(Priovrity Inversion).
JVM对CAS的支持
JAVA5.0之前如果不明确编码,是不能够调用CAS的, 在Java5.0后,引入了底层的支持, 在int, long和对象的引用等类型上都公开了CAS操作,并且便以为底层的硬件提供的最有效的方法, 原子变量类正是利用了这种功能来实现的。
原子变量类是一种泛化的volatile变量,能够支持原子的和有条件的读-改-写操作。原子变量类有:AtomicInteger, AtomicLong, AtomicBoolean以及AtomicReference.
与基于锁的方案相比, 非阻塞算法实现复杂,但是可伸缩性和活跃性拥有优势,多线程竞争相同数据的情况下不用阻塞,可以在更细的类度上进行协调, 减少调度开销, 在非阻塞算法中不存在死锁和活跃性问题。
原子变量提供了与volatile相同的内存语义, 同时支持原子操作, 比基于锁的操作更有可伸缩性。
锁的劣势:竞争锁的线程会挂起和恢复线程, 这样调度和开销会比较大。
Volatile是更轻级别的同步机制,在使用时不会发生上下文切换或者线程调度,但是volatile不能保证构建原子的复合操作,当一个变量依赖于其他变量或者当变量的新值依赖于旧值时, 就不能使用volatile变量。所以不能用来实现计数器和互斥体(mutex).
所得缺点还有线程在等待锁时不能做其他的事情, 这样多线程等待锁时,等待线程被阻塞。如果持有锁的线程优先级别低而请求所得线程优先级别高就会发生优先级别翻转(Priovrity Inversion).
JVM对CAS的支持
JAVA5.0之前如果不明确编码,是不能够调用CAS的, 在Java5.0后,引入了底层的支持, 在int, long和对象的引用等类型上都公开了CAS操作,并且便以为底层的硬件提供的最有效的方法, 原子变量类正是利用了这种功能来实现的。
原子变量类是一种泛化的volatile变量,能够支持原子的和有条件的读-改-写操作。原子变量类有:AtomicInteger, AtomicLong, AtomicBoolean以及AtomicReference.
相关文章推荐
- Java并发读书学习笔记(十一)——原子变量与非阻塞同步机制
- 并发编程实战学习笔记(十一)-原子变量与非阻塞同步机制
- 并发编程11.原子变量与非阻塞同步机制
- 读书笔记:Java并发实战第15章 原子变量与非阻塞同步机制
- Java并发编程实践笔记之—阻塞和中断方法(Blocking and Interruptible Methods)
- Java线程与并发编程实践----同步
- Java线程与并发编程实践----同步器(倒计时门闩,同步屏障)
- java并发编程实践笔记
- Java并发编程实践笔记之-什么是线程安全
- Java并发编程实践笔记之—发布和逸出(Publication and Escape)
- (42)21.4.2 在阻塞时终结---Java编程思想之并发笔记
- 多线程并发编程之原子变量与非阻塞同步机制
- java并发编程实践笔记
- java并发编程实践学习笔记
- Java并发编程实践阅读笔记
- 【Java并发编程】9、非阻塞同步算法与CAS(Compare and Swap)无锁算法
- Java并发编程实践笔记(一)——chapter1(IO,连接,线程)
- java并发编程实践笔记
- java并发编程实践 笔记(1)
- java并发编程实践笔记