Java并发编程体系

Java并发编程体系

文章目录

  • Java并发编程体系
    • 基础
      • 线程创建方式
      • 线程的状态
      • 目的
      • 线程不安全条件
      • 需要解决的问题
      • 三大特性
      • 对象头
      • 重排序
      • happens-before
    • 解决方式
      • synchronized
      • volatile
      • Atomic
      • Lock接口
      • 容器
    • Lock--JUC包
      • Lock接口
      • AbstractQueueSynahronizer接口
      • ReentrantLock
      • ReentrantWriteReadLock
      • CountDownLatch
      • CyclicBarrier
      • Semaphore
      • Exchange
      • fork/join
      • callable/future
      • wait/notify
      • Condition
    • 容器
      • CopyOnWriteList
      • ConcurrentLinkedQueue
      • ArrayBlockingQueue
      • ConcurrentHashMap
    • 线程池
    • happens-before

基础

线程创建方式

  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修饰字段初始化一定是在构造函数中

你可能感兴趣的:(java,Java并发编程体系)