Java全栈知识点问题汇总(上)(三)

续接上篇 Java全栈知识点问题汇总(上)-(二) Java并发 后续内容

3.8 JUC工具类

  • JUC工具类: CountDownLatch详解
  • JUC工具类: CyclicBarrier详解
  • JUC工具类: Semaphore详解
  • JUC工具类: Phaser详解
  • JUC工具类: Exchanger详解
  • Java 并发 - ThreadLocal详解

什么是CountDownLatch?

CountDownLatch底层也是由AQS,用来同步一个或多个任务的常用并发工具类,强制它们等待由其他任务执行的一组操作完成。

CountDownLatch底层实现原理?

其底层是由AQS提供支持,所以其数据结构可以参考AQS的数据结构,而AQS的数据结构核心就是两个虚拟队列: 同步队列sync queue 和条件队列condition queue,不同的条件会有不同的条件队列。CountDownLatch典型的用法是将一个程序分为n个互相独立的可解决任务,并创建值为n的CountDownLatch。当每一个任务完成时,都会在这个锁存器上调用countDown,等待问题被解决的任务调用这个锁存器的await,将他们自己拦住,直至锁存器计数结束。

CountDownLatch一次可以唤醒几个任务?

多个

CountDownLatch有哪些主要方法?

await(), 此函数将会使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。

countDown(), 此函数将递减锁存器的计数,如果计数到达零,则释放所有等待的线程

写道题:实现一个容器,提供两个方法,add,size 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束?

说出使用CountDownLatch 代替wait notify 好处?

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
​
/**
 * 使用CountDownLatch 代替wait notify 好处是通讯方式简单,不涉及锁定  Count 值为0时当前线程继续执行,
 */
public class T3 {
​
   volatile List list = new ArrayList();
​
    public void add(int i){
        list.add(i);
    }
​
    public int getSize(){
        return list.size();
    }
​
​
    public static void main(String[] args) {
        T3 t = new T3();
        CountDownLatch countDownLatch = new CountDownLatch(1);
​
        new Thread(() -> {
            System.out.println("t2 start");
           if(t.getSize() != 5){
               try {
                   countDownLatch.await();
                   System.out.println("t2 end");
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
        },"t2").start();
​
        new Thread(()->{
            System.out.println("t1 start");
           for (int i = 0;i