loadtest 간단하게 자바로 동시성 태스트를 하기 위해서 CyclicBarrier를 사용해서 프로세스 실행을 대기 시켜서 Thread Safe 여부를 확인하려고 한다. 아래 코드를 보고 사용법을 보고 여러가지 방향을로 변경시켜서 테스트 해보면 좋을것 같다 몇달전에 static 변수 사용시에 값이 썩여서 Thread Safe 하지 않다고 증명시켜준적이 있는데 아래와 비슷한 코드였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 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());     } } 
 
참조