并发编程概述

1.并发说明

  • 同步:协调两个或更多任务以获得预期结果的机制
  • 不可变对象:在其初始化后,不能修改其可视状态
  • 原子操作:是一种发生在瞬间的操作
  • 原子变量:是一种通过原子操作来设置和获取其值的变量
  • 共享内存:多个任务在读取和写入值的时候使用相同的内存区域
  • 消息传递:在不同计算机上运行多任务,任务之间进行通信

2.并发的问题

  • 数据竞争:两个或者多个任务在临界段之外对一个共享变量进行写入操作
  • 死锁:多个任务都在互相等待对方释放资源
  • 活锁:多个任务都在根据对方任务的变化而变化,从而导致死循环
  • 资源不足:当某个任务在系统中无法获取维持其继续执行所需的资源时,就会出现资源不足
  • 优先权反转:低优先权的任务持有了一个高优先级任务所需的资源时,就会发生优先权反转

3.Java内存模型

  • 重排序:编译器和处理器为了优化程序性能而对指令序列进行重新排序
  • 内存屏障:为了禁止编译器和处理器重排序,在编译器和 CPU 层面都有对应的指令
  • as-if-serial:语义表示不管怎么重排序,单线程程序的执行结果不能改变
  • happen-before:使用happen-before描述两个操作之间的内存可见性
  • volatile:对修饰的变量进行了同步,以保证获取到的是修改后的最新的值
  • 重排序双重检查加锁(Double Checking Locking):因为重排序的原因,会导致实例未执行构造方法时就返回内存地址,从而导致报错,可以用volatile修饰来解决
  • final重排序:被final关键字修饰的变量读写操作不能被重排序

并发容器

同步工具类

原子操作类

Lock与Condition

1.锁的分类

线程池与Future

ForkJoinPool

多线程设计模式