我一直假设 Date
和 Calendar
都不是线程安全的,但是在最近的一次讨论中,一位同事告诉我 日历
是线程安全的。
所以,我做了一些研究,但一无所获。有很多人认为它是线程安全的,也有很多人认为它不是线程安全的。而且,最重要的是,文档没有以任何方式说明任何内容,Calendar
甚至 Date
都没有说明。
那么,它是什么?
最佳答案
这里是Calendar的源代码链接和 GregorianCalendar在 Java 7 中
如果您阅读代码,您会发现没有一个实例方法是同步的,并且没有一个实例字段是volatile
。您还将看到,即使是字段 get
方法也可能导致 Calendar 实例发生变化。由于没有执行同步,不同的线程可能会在这样的变异操作之后看到 Calendar 对象字段的陈旧版本。
郑重声明,字段 get 方法中的突变操作发生在/调用此方法期间:
1555 protected void complete()
1556 {
1557 if (!isTimeSet)
1558 updateTime();
1559 if (!areFieldsSet || !areAllFieldsSet) {
1560 computeFields(); // fills in unset fields
1561 areAllFieldsSet = areFieldsSet = true;
1562 }
1563 }
简而言之,Calendar
类不是线程安全的,GregorianCalendar
也不是,因为它继承了非线程安全的字段和方法。
但不要只相信我的话。自己分析源代码。
And, to top it off, the documentation doesn't say anything one way or another, not for Calendar, nor even for Date.
如果 javadoc 没有指定类的线程安全性,那么您应该假设它不是线程安全的。 (特别是如果类设计是可变的。)
关于java - java.util.Calendar 线程是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12131324/