ThreadLocal SimpleDateFormatスレッドが安全でないことを解決

2296 ワード

SimpleDateFormatは同時環境ではスレッドの安全ではない.jdkドキュメントにコメントがあります.
 * Date formats are not synchronized.
 * It is recommended to create separate format instances for each thread.
 * If multiple threads access a format concurrently, it must be synchronized externally
 *
 * @see          Java Tutorial
 * @see          java.util.Calendar
 * @see          java.util.TimeZone
 * @see          DateFormat
 * @see          DateFormatSymbols
 * @author       Mark Davis, Chen-Lieh Huang, Alan Liu

threadLocalはこの問題を解決することができ、各スレッドは単独でSimpleDateFormatを作成し、各スレッドは互いに影響しない.コードは次のとおりです.
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

public class DateUtil {

    private static final ThreadLocal> dateFormatThreadLocal = new ThreadLocal>(){
        @Override
        protected Map initialValue() {
            return new HashMap();
        }

    };
    private static SimpleDateFormat getSimpleDateFormat(String datePattern){
        dateFormatThreadLocal.get().putIfAbsent(datePattern, new SimpleDateFormat(datePattern));
        return dateFormatThreadLocal.get().get(datePattern);
    }

    public static void main(String [] args){
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=1;i<=1;i++){
                    SimpleDateFormat simpleDateFormat = DateUtil.getSimpleDateFormat("yyyy-MM-dd");
                    System.out.println(Thread.currentThread().getName()+"-------"+simpleDateFormat);
                }
            }
        },"thread1").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=1;i<=2;i++){
                    SimpleDateFormat simpleDateFormat = DateUtil.getSimpleDateFormat("yyyy-MM-dd");
                    System.out.println(Thread.currentThread().getName()+"-------"+simpleDateFormat);
                }
            }
        },"thread2").start();
    }
}