Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程安全日期分析器_Java_Date_Thread Safety - Fatal编程技术网

Java 线程安全日期分析器

Java 线程安全日期分析器,java,date,thread-safety,Java,Date,Thread Safety,我正在寻找一个线程安全的替代品。在good old上没有实现,只是抛出了一个错误。有什么想法吗?我不需要任何花哨的东西,只需要线程安全性和处理此模式的能力:“yyyy-MM-dd”如果可能,请使用。它的日期/时间解析器是线程安全的,而且它通常是比date/Calendar更好的API 您可以只使用它的解析器,然后将返回值转换为Date,但我个人建议使用整个库。为什么不将simpleDataFormat.parseObject()的调用放入您自己的synchronized块中 找到了一个 如中所述

我正在寻找一个线程安全的替代品。在good old上没有实现,只是抛出了一个错误。有什么想法吗?我不需要任何花哨的东西,只需要线程安全性和处理此模式的能力:
“yyyy-MM-dd”

如果可能,请使用。它的日期/时间解析器是线程安全的,而且它通常是比
date
/
Calendar
更好的API


您可以只使用它的解析器,然后将返回值转换为
Date
,但我个人建议使用整个库。

为什么不将
simpleDataFormat.parseObject()
的调用放入您自己的
synchronized
块中

找到了一个

如中所述,您可以同步、使用线程局部变量或Joda Time

例如,使用线程局部变量:

public class DateFormatTest {

  private static final ThreadLocal<DateFormat> df
                 = new ThreadLocal<DateFormat>(){
    @Override
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyyMMdd");
    }
  };

  public Date convert(String source)
                     throws ParseException{
    Date d = df.get().parse(source);
    return d;
  }
}
公共类DateFormatTest{
私有静态最终线程本地df
=新线程本地(){
@凌驾
受保护的日期格式初始值(){
返回新的SimpleDataFormat(“yyyyMMdd”);
}
};
公共日期转换(字符串源)
抛出解析异常{
日期d=df.get().parse(源代码);
返回d;
}
}
java.time
java.time
类型是线程安全的。
java.time
API(The*)作为JavaSE8标准库的一部分,自2014年3月以来一直存在

以下引述的是政府的通知:

注意,从JavaSE8开始,用户被要求迁移到Java.time(JSR-310)——JDK的核心部分,它取代了这个项目

演示:

import java.time.LocalDate;

public class Main {
    public static void main(String[] args) {
        String strDate = "2021-06-13";
        LocalDate date = LocalDate.parse(strDate);
        System.out.println(date);
    }
}
2021-06-13
输出:

import java.time.LocalDate;

public class Main {
    public static void main(String[] args) {
        String strDate = "2021-06-13";
        LocalDate date = LocalDate.parse(strDate);
        System.out.println(date);
    }
}
2021-06-13

现代日期时间API基于并且不需要显式使用
DateTimeFormatter
对象,只要日期时间字符串符合ISO 8601标准。您可能已经注意到,我在上述代码中没有使用解析类型(
DateTimeFormatter
),因为
yyyy-MM-dd
也是日期的ISO 8601模式

了解有关现代日期时间API的更多信息


*无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

这可能不太好,但很容易。性能将取决于同时有多少线程真正尝试访问格式化程序。我会先尝试一下(或者只是将对SimpleDataFormat的调用包装在一个同步块中),看看这是否真的是一个问题。+1无阻塞。用内存换取线程安全。简单案件没有外部大图书馆。你的答案是高声誉炸弹的附带受害者。