并发编程概述
1.并发说明
- 同步:协调两个或更多任务以获得预期结果的机制
- 不可变对象:在其初始化后,不能修改其可视状态
- 原子操作:是一种发生在瞬间的操作
- 原子变量:是一种通过原子操作来设置和获取其值的变量
- 共享内存:多个任务在读取和写入值的时候使用相同的内存区域
- 消息传递:在不同计算机上运行多任务,任务之间进行通信
2.并发的问题
- 数据竞争:两个或者多个任务在临界段之外对一个共享变量进行写入操作
- 死锁:多个任务都在互相等待对方释放资源
- 活锁:多个任务都在根据对方任务的变化而变化,从而导致死循环
- 资源不足:当某个任务在系统中无法获取维持其继续执行所需的资源时,就会出现资源不足
- 优先权反转:低优先权的任务持有了一个高优先级任务所需的资源时,就会发生优先权反转
3.Java内存模型
- 重排序:编译器和处理器为了优化程序性能而对指令序列进行重新排序
- 内存屏障:为了禁止编译器和处理器重排序,在编译器和 CPU 层面都有对应的指令
- as-if-serial:语义表示不管怎么重排序,单线程程序的执行结果不能改变
- happen-before:使用happen-before描述两个操作之间的内存可见性
- volatile:对修饰的变量进行了同步,以保证获取到的是修改后的最新的值
- 重排序双重检查加锁(Double Checking Locking):因为重排序的原因,会导致实例未执行构造方法时就返回内存地址,从而导致报错,可以用volatile修饰来解决
- final重排序:被final关键字修饰的变量读写操作不能被重排序