SimpleDateFormat에 대한 javadoc은 SimpleDateFormat이 동기화되지 않음을 나타냅니다.
"날짜 형식은 동기화되지 않습니다. 각 스레드에 대해 별도의 형식 인스턴스를 만드는 것이 좋습니다. 여러 스레드가 동시에 형식에 액세스하는 경우 외부에서 동기화해야합니다."
그러나 다중 스레드 환경에서 SimpleDateFormat의 인스턴스를 사용하는 가장 좋은 방법은 무엇입니까? 내가 생각한 몇 가지 옵션이 있습니다. 과거에 옵션 1과 2를 사용했지만 더 나은 대안이 있는지 또는 이러한 옵션 중 어떤 옵션이 최상의 성능과 동시성을 제공하는지 알고 싶습니다.
옵션 1 : 필요한 경우 로컬 인스턴스 생성
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
옵션 2 : SimpleDateFormat의 인스턴스를 클래스 변수로 생성하지만 이에 대한 액세스를 동기화합니다.
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
옵션 3 : ThreadLocal을 생성하여 각 스레드에 대해 SimpleDateFormat의 다른 인스턴스를 저장합니다.
private ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>();
public String formatDate(Date d) {
SimpleDateFormat sdf = tl.get();
if(sdf == null) {
sdf = new SimpleDateFormat("yyyy-MM-hh");
tl.set(sdf);
}
return sdf.format(d);
}