基礎框架搭建和併發模擬工具,程式碼

(1)基礎框架搭建

(2)併發模擬

(3)CountDownLatch  通常用來 保證 幾個執行緒執行完成之後,再執行其他的程式碼

Semaphore 控制同一時刻的併發量

@Slf4j
@NotThreadSafe
public class ConcurrencyTest {

    //請求次數
    private static int clientTotal = 5000;

    //允許同時執行的執行緒數
    private static int threadTotal = 200;

    //計數
    public static int count = 0;

    public static void main(String[] args) {
        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) {
                    log.error("exception", e);
                }
                countDownLatch.countDown();
            });

        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        executorService.shutdown();
        log.info("count:{}", count);
    }
    private static void add() {
        count++;
    }
}

執行程式碼可以看到每次計數的結果都不一樣,並且可能不是5000,因為同一時刻200個執行緒同時執行將count加1,而count並不是對於執行緒之間可見,可能兩個執行緒在讀取count的時候結果是一樣的,同時對值加+1,因此就會造成最後的結果可能不是5000,這種方式是執行緒不安全的。