• BlockingQueue

    image.png

    • 常用方法
      • offer/poll 不阻塞; put/take 阻塞
    • AQS: AbstractQueuedSynchronizer,是并发容器
    • 常用实现类
      • ArrayBlockingQueue
        • 可以用来参考阻塞队列的写法
      • LinkedBlockingQueue
        • 为了提高并发度,用2把锁,分别控制队头、队尾的操作。意味着在put(…)和put(…)之间、take()与take()之间是互斥的,put(…)和take()之间并不互斥。但对于count变量,双方都需要操作,所以必须是原子类型。
        • 因为各自拿了一把锁,所以当需要调用对方的condition的signal时,还必须再加上对方的锁,
          就是signalNotEmpty()和signalNotFull()方法。
    • 同步工具类:
      • Semaphore : 大学生抢座、抢资源
      • CountDownLatch : 主任务等待子任务完成
      • CyclicBarrier

    image.png

    • Exchanger :线程之间交换数据
      • // 如果没有其他线程调用exchange,线程阻塞,直到有其他线程调
        用exchange为止。String otherData = exchanger.exchange(“交换数据1”);
    • Phaser
      • 从JDK7开始,新增了一个同步工具类Phaser,其功能比CyclicBarrier和CountDownLatch更加强
        大。
        • 可以动态修改线程数量
        • 可以有更多的线程层次