yaochow@home:~$

【介绍】CountDownLatch& Semaphore

先看看栗子:

package com.yaochow.demo;

import org.junit.Test;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class TestPlatform {

    public static int clientTotal = 10000;//访问数
    public static int threadTotal = 4;//线程数
    public static int count = 0;

    @Test
    public void test() throws InterruptedException {

        ExecutorService executorService = Executors.newCachedThreadPool();

        final Semaphore semaphore = new Semaphore(threadTotal);
        final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
        for (int i = 0; i < clientTotal; i++) {
            executorService.execute(() -> {
                try {
                    semaphore.acquire();
                    add();
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        executorService.shutdown();
        System.out.println(count);
    }

    private static void add() {
        count++;//每访问一次加一
    }
}

结果:

9997

从结果中可以看到,出现了并发问题。

在工作中有时会遇见各类奇怪的问题,在解决问题的时候首先需要让问题复现,再去一点点扒代码定位问题。 各大公司实际上都有提供并发测试环境,不过要部署到测试环境,这样就比较麻烦。 所以试着写一个并发测试的栗子。

这个就是本地并发测试的一个栗子,当线程数越高的时候,越容易复现问题。通过这个栗子也可以了解一下CountDownLatch& Semaphore。

CountDownLatch的作用是让一个或N个线程等待其他线程运行结束之后再继续运行。

Semaphore的作用是保证同一时间最多只有固定的线程在工作。

以上,源码下次在撸。