java并发编程的艺术
一、并发编程的挑战
- 线程并发是在CPU的不同时间片下执行不同的代码,期中涉及的上下文切换和资源调度会增加代码执行时间,只有执行次数在百万级以上才可以看到并发相对于串行执行的效率优势;
- 减少上下文切换的方法包括:1.无锁并发编程,不同线程处理不同段的数据,减少锁竞争引起的上下文切换;2.CAS算法:java的Atomic包使用CAS算法更新数据,不用加锁;3.使用最少线程,避免创建不需要的线程,以免线程等待;
- 避免死锁导致代码运行停滞的方法:1.一个线程尽量值获取一个锁,占用一个资源;2.使用定时锁替代内部锁;3.数据库锁的加锁和解锁必须在一个数据库连接;
- 资源限制是并发编程中必须考虑的因素;
- 多使用JDK并发包提供的并发容器和工具类来解决并发问题;
二、java并发机制的低层实现原理
1、volatile
- volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性,即一个线程修改共享变量时另一个线程也可以读到这个修改的值;如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的;使用它的成本更低,因为它不会引起上下文切换和调度;
- 为了提升处理速度,处理器不直接与内存进行通信,而是将系统内存的数据读到内部缓存后再操作,但操作完写回系统内存的时机是不确定的。相对于普通变量的写操作,volatile