Datetime Java如何在日期时间API中实现线程安全

Datetime Java如何在日期时间API中实现线程安全,datetime,java-8,thread-safety,Datetime,Java 8,Thread Safety,在上一个日期时间API线程不安全。。。。我想知道他们是如何在Java8中的新日期时间API中实现的??(早期,他们还可以通过使用同步和为每个线程生成seprate实例来保护线程)在Java8中,他们添加了新的内容,并给出了一些示例。。。多谢各位 自Java早期就存在的SimpleDataFormat使用内部字段来保存临时状态,但没有采取任何措施来防止两个线程同时更新这些字段。如果两个线程碰巧同时在同一个SimpleDataFormat实例上调用format或parse方法,这将导致返回错误的日期

在上一个日期时间API线程不安全。。。。我想知道他们是如何在Java8中的新日期时间API中实现的??(早期,他们还可以通过使用同步和为每个线程生成seprate实例来保护线程)在Java8中,他们添加了新的内容,并给出了一些示例。。。多谢各位

自Java早期就存在的
SimpleDataFormat
使用内部字段来保存临时状态,但没有采取任何措施来防止两个线程同时更新这些字段。如果两个线程碰巧同时在同一个SimpleDataFormat实例上调用
format
parse
方法,这将导致返回错误的日期,因为它们会修改
SimpleDataFormat
对象的内部状态,而另一个线程仍在使用该状态


Java 8没有做任何改变
SimpleDataFormat
,而是引入了一个全新的
LocalDate
API,它使用内部同步来保护并发访问的字段(并且可能使用局部变量来减少锁定开销,但我没有检查这一点),同时消除了时区和1990年以前日期的复杂性,这也是旧日期API用户头疼的问题。

java.time(从java 8引入的现代java日期和时间API)中的线程安全性是通过不可变类获得的。不可变对象始终是线程安全的(请参阅第一个链接底部附近最后一条语句的修改)。正如霍尔格在书中指出的

没有变异,就不会有任何不一致

链接:


您对Java-8 DateTime API中的线程安全到底意味着什么?请您发布一些例子或用例,其中提到的线程安全是有意义的。主要是不可变的数据对象。对于不可变对象,您根本不必担心线程安全。堆栈溢出不是讨论站点。要进行讨论,请访问网站,如。提示:请参阅Wikipedia页面以获取相关信息。首先,像
LocalDate
LocalDateTime
Instant
等类是不可变的,这样就不需要任何同步,因为没有变异,就不会有任何不一致。对于格式化程序,它们也是不可变的,并将其临时状态保存在局部变量和局部构造的对象中。“时区的复杂性”仍然为那些需要它的人所支持,请看,这是我第一次看到有人声称“1990年之前的日期”不受支持。不是1990年之前的日期不受支持,而是两位数的日期以1990年后为基础,月份以0为基础,天数以1为基础,因此,API的新用户必须阅读Javadoc才能有机会正确处理日期。如果你说的是,它使用“年份减去1900”,没有提到1990年,并且在你的回答中没有提到日和月表示的不一致性。如果是
SimpleDateFormat
,则为两位数年份的基数。因此,总的来说,旧的API确实是一团糟,但您在回答中所写的并没有解决实际问题。