Datetime Java如何在日期时间API中实现线程安全
在上一个日期时间API线程不安全。。。。我想知道他们是如何在Java8中的新日期时间API中实现的??(早期,他们还可以通过使用同步和为每个线程生成seprate实例来保护线程)在Java8中,他们添加了新的内容,并给出了一些示例。。。多谢各位 自Java早期就存在的Datetime Java如何在日期时间API中实现线程安全,datetime,java-8,thread-safety,Datetime,Java 8,Thread Safety,在上一个日期时间API线程不安全。。。。我想知道他们是如何在Java8中的新日期时间API中实现的??(早期,他们还可以通过使用同步和为每个线程生成seprate实例来保护线程)在Java8中,他们添加了新的内容,并给出了一些示例。。。多谢各位 自Java早期就存在的SimpleDataFormat使用内部字段来保存临时状态,但没有采取任何措施来防止两个线程同时更新这些字段。如果两个线程碰巧同时在同一个SimpleDataFormat实例上调用format或parse方法,这将导致返回错误的日期
SimpleDataFormat
使用内部字段来保存临时状态,但没有采取任何措施来防止两个线程同时更新这些字段。如果两个线程碰巧同时在同一个SimpleDataFormat实例上调用format
或parse
方法,这将导致返回错误的日期,因为它们会修改SimpleDataFormat
对象的内部状态,而另一个线程仍在使用该状态
Java 8没有做任何改变
SimpleDataFormat
,而是引入了一个全新的LocalDate
API,它使用内部同步来保护并发访问的字段(并且可能使用局部变量来减少锁定开销,但我没有检查这一点),同时消除了时区和1990年以前日期的复杂性,这也是旧日期API用户头疼的问题。java.time(从java 8引入的现代java日期和时间API)中的线程安全性是通过不可变类获得的。不可变对象始终是线程安全的(请参阅第一个链接底部附近最后一条语句的修改)。正如霍尔格在书中指出的
没有变异,就不会有任何不一致
链接:
LocalDate
、LocalDateTime
、Instant
等类是不可变的,这样就不需要任何同步,因为没有变异,就不会有任何不一致。对于格式化程序,它们也是不可变的,并将其临时状态保存在局部变量和局部构造的对象中。“时区的复杂性”仍然为那些需要它的人所支持,请看,这是我第一次看到有人声称“1990年之前的日期”不受支持。不是1990年之前的日期不受支持,而是两位数的日期以1990年后为基础,月份以0为基础,天数以1为基础,因此,API的新用户必须阅读Javadoc才能有机会正确处理日期。如果你说的是,它使用“年份减去1900”,没有提到1990年,并且在你的回答中没有提到日和月表示的不一致性。如果是SimpleDateFormat
,则为两位数年份的基数。因此,总的来说,旧的API确实是一团糟,但您在回答中所写的并没有解决实际问题。