[JAVA] 간단하게 Race Condition 상황 테스트하기 ( Synchronized )

CodeKong의 기술 블로그·2024년 5월 12일
2

JAVA

목록 보기
4/5

동시성 관련 해결 연구 중 직접 Thread를 만들어 Race Condition을 재현해 보고싶어 순수 java 환경에서 Test 해보았다.

public class Main{  
  
    public static void main(String[] args) {  
  
        for (int i = 0; i < 5; i++) {  
            ThreadInstance threadInstance = new ThreadInstance("Thread" + i);  
            threadInstance.start();  
        }  
  
        System.out.println(ThreadInstance.getSharedValue());  
    }  
  
}
public class ThreadInstance extends Thread{  
  
    private String name;  
    private static int sharedValue = 0;  
  
    public ThreadInstance(String name) {  
        this.name = name;  
    }  
  
    @java.lang.Override  
    public void run() {  
        for (int i = 0; i < 100; i++) {  
            increaseSharedValue();  
            try {  
                Thread.sleep(1);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
  
    }  
  
    public static int getSharedValue() {  
        return sharedValue;  
    }  
  
    public static void increaseSharedValue() {  
        sharedValue++;  
        System.out.println("현재 공유값은 " + sharedValue + "입니다.");  
    }  
}

예상했던 500이 나오지 않고 463이 출력되었다.

해결을 위해 공유자원에 접근하는 메소드를 Thread-Safe하게 접근하기 위해 Synchronized를 적용하였다.

synchronized public static void increaseSharedValue() {  
    sharedValue++;  
    System.out.println("현재 공유값은 " + sharedValue + "입니다.");  
}

작동 완료!

0개의 댓글