동시성 관련 해결 연구 중 직접 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 + "입니다.");
}
작동 완료!