AQS(抽象队列同步器)

其是可重入锁底层实现并发的核心组件,其内部主要有三个部分:
AQS,COW,CountDownLatch - 图1
其组件功能有:

  • state:标识加锁次数,第一次加锁是通过CAS判断0/1的,如果是0可以直接进行加锁,如果是1则需要判断lock thread是否是当前线程,如果是则state+1,如果不是将当前线程移到等待队列。
  • lock thread:标识当前加锁的线程,保证一次只有一个线程可以获得锁
  • waiting list:等待加锁的线程

COW(写时复制)

COW是操作系统经典的一种并发优化策略,其主要针对读多写少时的并发场景。在LINUX中,fork()指令通常会创建一个子进程,但此时并不会给它分配内存空间而是跟父进程共用一个内存空间,只有在写时才会复制父进程空间里的数据。
而JAVA也采用了COW的机制,有CopyOnWriteArrayList这种的数据结构。其主要的缺点是写时的全复制会导致很大的内存开销,同时COW不保证数据的实时一致性,只保证数据最终一致性。

CountDownLatch

这是JUC的一个并发工具,其被描述为同步计数器,其主要用法有两点:

  1. 线程等待n个前置线程的完成,将计数器设置为n,每次任务完成计数器-1,当计数器为0时唤醒线程。
  2. 使n个线程同步开始,就是将n个线程都阻塞在计数器为1的位置,再把计数器清零让它们同步开始

其缺点主要是只有在初始化时才能设置计数器计数,一旦计数器被创建只能进行减一的操作而不能执行其他操作