Java并发编程体系.md

Posted by lizhao on 07-09,2019

Java并发编程体系

[toc]

基础

线程创建方式

  1. Thread
  2. Runable
  3. Callable/Future
  4. Executor
  5. 定时任务

线程的状态

  1. 初始化--就绪--运行中--结束
  2. wait/notify
  3. sleep
  4. synchronized

目的

  1. 线程安全性
  2. 线程性能--上下文切换需要消耗
  3. 优化

线程不安全条件

  1. 多线程
  2. 共享变量
  3. 非原子性操作

需要解决的问题

  1. 死锁
  2. 饥饿
  3. 活锁

三大特性

  1. 原子性
  2. 可见性
  3. 有序性
数据库的四个特性ACID: 原子性,一致性,隔离性,持久性

对象头

  1. MarkWord
    1. 年龄
    2. 线程id
    3. 锁标志位
    4. GC标志
  2. 类型指针
  3. 数组长度

  1. 偏向锁
  2. 轻量级锁、CAS
  3. 重量锁
  4. 公平锁
  5. 非公平锁
  6. 读写锁
  7. 锁降级/升级
  8. 死锁/活锁

重排序

  1. 虚拟机的优化手段
  2. 编译器优化和cpu优化
  3. as-if-serial原则,无耦合性,前后顺序

happens-before

解决方式

synchronized

  1. monitorEnter/monitorExit
  2. 缓存一致性
  3. 重入锁
  4. 偏向锁-轻量级锁-重量级锁
  5. 类、方法、代码块、静态方法
  6. 原子性、可见性、有序性

volatile

  1. Java内存模型,
  2. 保证内存可见性,
  3. 通过无效化cpu缓存,
  4. CPU缓存一致性协议MESI(被修改(Modified)、独享的(Exclusive)、共享的(Shared)、无效的(Invalid))

Atomic

  1. CAS
  2. AtomicInteger
  3. LongAdder

Lock接口

容器

Lock--JUC包

Lock接口

  1. lock
  2. unlock
  3. trylock

AbstractQueueSynahronizer接口

  1. AQS
  2. 模板方法-设计模式
  3. 通过 state 控制状态
  4. 一个基于FIFO队列
  5. 对外提供 5 个重写方法
  6. isHeldExclusively 方法表示是否为独占的
  7. 独占模式下 tryAcquire/tryRelease 获取释放对象
  8. 共享模式下 tryAcquireShared/tryReleaseShared 获取释放对象

ReentrantLock

  1. 实现Lock接口
  2. 可重入锁
  3. 实现公平锁/非公平锁(通过2个不同内部类实现AQS)
  4. 使用状态值判断是否已加锁
  5. CAS

ReentrantWriteReadLock

  1. 实现Lock接口
  2. 可重入锁
  3. 实现公平锁/非公平锁(通过2个不同内部类实现AQS)
  4. 实现读锁和写锁(通过2个不同内部类实现AQS)
  5. 里面的state分为2部分(16位+16位)

CountDownLatch

  1. 开车之前,6个人都绑了安全带,司机才往前开
  2. 多个线程都count下,另一个线程才继续
  3. 维护了一个count
  4. count维护在AQS中

CyclicBarrier

  1. 跑步之前,所有人准备就绪,然后各个运动员往前跑
  2. 多线程阻塞,等待这一批线程都到达某个点
  3. 维护了一个count
  4. 没用AQS

Semaphore

  1. 信号量
  2. 5个人3台机床,其中2人等其他人做完在继续
  3. 实现公平锁/非公平锁(通过2个不同内部类实现AQS)
  4. 相当于线程池

Exchange

  1. 多个线程之间可以交换数据

fork/join

  1. 可以拆分成多个任务

callable/future

  1. 带返回值的线程

wait/notify

Condition

  1. 条件锁

容器

CopyOnWriteList

  1. 读写分离
  2. List
  3. 写在新的数组操作,后面复制数组

ConcurrentLinkedQueue

  1. 链表
  2. 队列
  3. head、tail
  4. 单数tail=head
  5. 双数分开

ArrayBlockingQueue

  1. 阻塞队列
  2. 生产者消费者
  3. 通过Condition,来判断不同的等待条件

ConcurrentHashMap

  1. 1.7使用的是分段锁
  2. 1.8使用的是数组加链表,next和val使用valatile,保证线程安全性
  3. 使用CAS操作

线程池

  1. 参数:核心、最大、过期时间、单位、阻塞模式
  2. Executor 接口,里面有 execute 方法
  3. ExecutorService继承Executor
  4. FixedThreadPool 核心和最大线程数一样
  5. CachaThreadPool 核心为0,最大为很大
  6. SingleThreadPool 核心线程为1,
  7. ScheduledThreadPoolExecutor 定时任务

happens-before

描述了可见性,但是不确保执行顺序

  1. 代码顺序
  2. 锁原则,解锁会在二次加锁之前
  3. volatile原则,防止重排序,
  4. 传递性
  5. start规则,线程启动中
  6. final规则,final修饰字段初始化一定是在构造函数中