我一直在假设既不是线程安全Date
也不Calendar
是线程安全的,但是,在最近的讨论中,一位同事告诉我Calendar
是线程安全的.
所以,我做了一些研究,并没有提出任何建议.有很多人认为它是线程安全的,很多人认为它不是线程安全的.而且,最重要的是,文档不会以某种方式说出任何内容,不是为了Calendar
,甚至也不是Date
.
那么,这是什么?
Ste*_*n C 29
这是Java 7 中Calendar和GregorianCalendar源代码的链接
如果您阅读代码,您将看到没有任何实例方法同步,并且没有实例字段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 }
Run Code Online (Sandbox Code Playgroud)
简而言之,Calendar
该类不是线程安全的,GregorianCalendar
也不是因为它继承了非线程安全的字段和方法.
但是,不要只听我的话.做自己的源代码分析.
而且,最重要的是,文档不会以任何方式说出任何内容,不是针对日历,甚至也不是针对日期.
如果javadocs没有指定类的线程安全性,那么您应该假定它不是线程安全的.
归档时间: |
|
查看次数: |
15528 次 |
最近记录: |