본문 바로가기
프로그래밍

SimpleDateFormat 쓰레드 세이프 하지 않음

by 탁구치는 개발자 2015. 7. 2.

SimpleDateFormat 클래스는 쓰레드 세이프 하지 않기 때문에 사용할 때 주의를 해야 한다. 



다음은 쓰레드 10개를 실행시켜 SimpleDateFormat의 parse("20150630") 메서드를 동시에 실행시키는 테스트 코드이다.


위의 코드를 실행해 보면 다음과 같이 정상적으로 테스트가 종료되는 경우가 있고, 오류가 발생되는 케이스가 있다.

출력된 로그에 나와 있는 것처럼 테스트 코드에서 의도한 Tue Jun 30 00:00:00 KST 2015 값만 노출되는 것이 아닌 이상한 날짜가 출력되고 있는 것을 볼 수 있다.

이는 Thread safe하지 않은 상태에서 여러 쓰레드가 SimpleDateFormat 을 사용하게 됨으로써 발생되는 현상이다.

오류가 발생하면 그나마 다행이지만 가장 큰 우려는 잘못된 데이터가 저장이 될 수 있다는 것이다.


[잘못된 데이터 출력 케이스]

threadName ==> pool-1-thread-1

threadName ==> pool-1-thread-3

threadName ==> pool-1-thread-2

threadName ==> pool-1-thread-4

threadName ==> pool-1-thread-5

threadName ==> pool-1-thread-1

threadName ==> pool-1-thread-5

threadName ==> pool-1-thread-3

threadName ==> pool-1-thread-4

threadName ==> pool-1-thread-2

Tue Jun 30 00:00:00 KST 2015

Tue Jun 30 00:00:00 KST 2015

Mon Mar 30 00:00:00 KST 2020

Tue Jun 30 00:00:00 KST 2015

Sun Aug 02 00:00:00 KST 2015

Tue Jun 30 00:00:00 KST 2015

Tue Jun 30 00:00:00 KST 2015

Sat Jun 30 00:00:00 KST 1520

Tue Jun 30 00:00:00 KST 2015

Sat Jun 30 00:00:00 KST 1520



[오류 케이스]

Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.NumberFormatException: For input string: ""

java.util.concurrent.ExecutionException: java.lang.NumberFormatException: multiple points

java.util.concurrent.ExecutionException: java.lang.NumberFormatException: For input string: "2015.2015E4.2015E4"