多线程中的静态方法

doN*_*doN 1 java date simpledateformat

我班上有以下代码

private static final SimpleDateFormat SDF_ISO_DATE = new SimpleDateFormat("yyyy-MM-dd");
private static final SimpleDateFormat SDF_ISO_TIME = new SimpleDateFormat("HH:mm:ss");

public static String getTimeStampAsString(final long time) {
    TimeZone tz = TimeZone.getTimeZone("UTC");
    SDF_ISO_DATE.setTimeZone(tz);
    SDF_ISO_TIME.setTimeZone(tz);
    return SDF_ISO_DATE.format(
        new Date(time)) + " " + SDF_ISO_TIME.format(new Date(time)
    );
}
Run Code Online (Sandbox Code Playgroud)

在我的多线程应用程序中,以下方法将来会返回日期,即使对于当前日期,静态方法或变量是否对此负责?

编辑:

我有以下代码来重现和证明答案中提到的内容,但仍然无法.可以帮助我同样的一些人.

public static void main(String[] args) throws InterruptedException, ExecutionException {

            Callable<String> task = new Callable<String>(){
                public String call() throws Exception {
                    return DateUtil.getTimeStampAsString(1524567870569L);
                }
            };

            //pool with 50 threads
            ExecutorService exec = Executors.newFixedThreadPool(50);
            List<Future<String>> results = new ArrayList<Future<String>>();

            //perform 10 date conversions
            for(int i = 0 ; i < 50 ; i++){
                results.add(exec.submit(task));
            }
            exec.shutdown();
            //look at the results
            for(Future<String> result : results){
                System.out.println(result.get());
            }
    }
Run Code Online (Sandbox Code Playgroud)

kum*_*ana 5

是静态方法还是变量负责这个?

静态变量.SimpleDateFormat不是线程安全的,因为您通过调用setTimeZone()来修改其内部状态,所以这应该是显而易见的.这意味着有几个线程可以同时执行此操作,这应该会产生不可预测的结果.

您需要在本地构建格式,而不是重复使用静态定义的格式.或者更好的是,删除Java的旧时间管理类并使用java.time.*代替.