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"
'프로그래밍' 카테고리의 다른 글
Java Generic 정리 (3) | 2016.01.13 |
---|---|
Spring RestTemplate 사용 시 HTTP request, response 로그 남기기 (0) | 2015.10.16 |
문자열 인코딩에 대한 정리 (0) | 2015.08.19 |
Servlet의 request, response와 JSP의 request, response는 서로 다른 객체 (0) | 2015.07.23 |
mybatis multiple select key (2) | 2015.05.21 |
iframe사이트와 parent사이트간 메세지 전송 방법 (서로 도메인이 다른 경우) (0) | 2015.05.21 |
HTTP request 요청 시 Content-Type의 중요성 (6) | 2015.03.09 |
@InitBinder를 이용한 사용자 로그인 정보 @ModelAttribute 객체에 저장하기 (0) | 2015.03.04 |