Java同時プログラミング入門と高同時面接-001


タイトル:
現在200人のユーザが同時に要求を開始し、add操作、count++を要求するたびに5000個の要求を受信している.
コード:
@Slf4j
public class CountExample {

    //  
    public static int clientTotal = 5000;
    //  
    public static int threadTotal = 1;

    public static long count = 0;

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        final Semaphore semaphore = new Semaphore(threadTotal); //  200 
        for (int i = 0; i < clientTotal; i++) {
            executorService.execute(new Runnable() {

                @Override
                public void run() {
                    try {
                        semaphore.acquire();//  
                        add();
                        semaphore.release(); //  
                    } catch (InterruptedException e) {
                        log.error("exception", e);
                    }
                }
            });
        }
        executorService.shutdown();
        log.info("count:" + count);
    }

    private static void add() {
        count++ ;
    }
}

分析:
threadTotal=1またはthreadTotal=200では、実行するたびに結果が異なり、後者は5000になります.
単純な累積操作では、5000スレッドの同じ時間に1つのプロセスのみが実行され、200プロセスが実行された場合とは異なります.
私たちのローカルシミュレーションのようなプロセスでは、どのようにシミュレーションしても正しいので、オンラインになるとエラーが発生します.このとき、同時問題かどうかを考えなければなりません.
同時シミュレーション:
  • PostMan:Http要求シミュレーションツール
  • Apache Bench(AB):Apacheに付属のツールで、Webサイトのパフォーマンスをテストする
  • JMeter:Apache組織が開発した圧力テストツール
  • その他の資料:
  • 信号量Semaphoreのacquireとreleaseについての説明
  • CountDownLatchとは何ですか