使用CountDownLatch模拟高并发场景

通过CountDownLatch的简单应用和实现原理这篇博客,可以简单的了解到CountDownLatch的作用。

由此引申出使用CountDownLatch模拟高并发场景的想法,作为一个并发编程的计数器,我们是不是可以设想创建1000个线程,等所有的线程都创建完成后,CountDownLatch初始值归0,1000个线程就会执行接下来的逻辑,并发访问接口

代码样例:

 public static void main(String[] args) throws Exception {
        //AtomicInteger的操作是原子类的,基于CAS操作,方便测试
        AtomicInteger atomicInteger = new AtomicInteger(0);
        //这是一千个线程的计数器,当一千个线程创建完成后就会归0
        CountDownLatch countDownLatchThread = new CountDownLatch(1000);
        //这是主线程的计数器,当一千个线程都执行完自己的业务逻辑后,就会归0
        CountDownLatch countDownLatchMain = new CountDownLatch(1000);
        //创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(6);

        //开始循环创建1000个线程
        for (int i = 0; i < 1000; i++) {
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                        countDownLatchThread.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //业务逻辑,让atomicInteger对象自增,可以想象成访问一个接口,修改某个表的字段值
                    atomicInteger.incrementAndGet();
                    //业务逻辑执行完,把主线程计数器减1
                    countDownLatchMain.countDown();
                }
            });
            //线程创建成功,把线程计数器减1
            countDownLatchThread.countDown();
        }
        //主线程等待,只有等countDownLatchMain的初始值为0是才会继续执行
        countDownLatchMain.await();
        System.out.println("1000个线程并发访问atomicInteger对象,值为" + atomicInteger);
        //关闭线程池
        executorService.shutdown();
    }

具体的逻辑已经清楚的写在了注释里,运行结果如下:
在这里插入图片描述

你可能感兴趣的:(Java并发编程)