概念

并行和并发

  • 并行(parallel):同一时间动手做(doing)多件事的能力。
  • 并发(concurrent):同一时间应对(dealing with)多件事的能力。

    操作系统中线程状态

    image.png

    JAVA中的线程状态

    image.png

    AQS

    AbstractQueuedSynchronizer

    AQS相关知识

    以下代码摘抄自AbstractQueuedSynchronizer类

第一部分

  1. private transient volatile Node head;
  2. private transient volatile Node tail;
  3. // 用于判定共享资源是否正在被占用
  4. private volatile int state;

Q&A

  1. state为何不使用boolean类型,占用空间小,且能表示二异性?

获取锁的方式有两种:

  • 独占式:一旦被占用,其他线程不能占用。
  • 共享式:一旦被占用,其他共享模式的线程可以占用。

而处于共享模式时,int类型的state还可以用来表示正在使用共享资源的线程数量。

  1. head 和 tail 的作用?

当线程没有抢占到锁时,会进行排队。而这个排队的结构是一个FIFO(先进先出)的双向链表,head用于表示队列首位,tail表示末尾。

第二部分-Node结构

  1. static final class Node {
  2. static final int CANCELLED = 1;
  3. static final int SIGNAL = -1;
  4. static final int CONDITION = -2;
  5. static final int PROPAGATE = -3;
  6. volatile int waitStatus; // 等待状态
  7. volatile Node prev; // 前指针
  8. volatile Node next; // 后指针
  9. volatile Thread thread; // 线程对象
  10. Node nextWaiter;
  11. }