loadtest

간단하게 자바로 동시성 태스트를 하기 위해서 CyclicBarrier를 사용해서 프로세스 실행을 대기 시켜서 Thread Safe 여부를 확인하려고 한다. 아래 코드를 보고 사용법을 보고 여러가지 방향을로 변경시켜서 테스트 해보면 좋을것 같다 몇달전에 static 변수 사용시에 값이 썩여서 Thread Safe 하지 않다고 증명시켜준적이 있는데 아래와 비슷한 코드였다.


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StopWatch;
import org.springframework.web.client.RestTemplate;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;


public class LoadTest {
    static AtomicInteger counter = new AtomicInteger(0);
    private static final Logger log = LoggerFactory.getLogger(LoadTest.class);

    public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
        int cnt = 100;
        ExecutorService es = Executors.newFixedThreadPool(cnt);

        RestTemplate rt = new RestTemplate();
        String url = "http://localhost:8080/rest?idx={idx}";
        CyclicBarrier barrier = new CyclicBarrier(cnt);
        for (int i = 0; i < cnt ; i++) {
            es.submit(()->{
                int idx = counter.addAndGet(1);
                barrier.await();
                log.info("Thread {}",idx);
                StopWatch sw = new StopWatch();
                sw.start();
                String res = rt.getForObject(url,String.class,idx);
                sw.stop();
                log.info("Elapsed : {} {} / {}",idx,sw.getTotalTimeSeconds(),res);
                return null;
            });
        }
        barrier.await();
        StopWatch main = new StopWatch();
        main.start();

        es.shutdownNow();
        es.awaitTermination(100, TimeUnit.SECONDS);

        main.stop();

        log.info("Elapsed main : {}",main.getTotalTimeSeconds());

    }
}


참조