Re: Calendar.getInstance() thread safe?
endymion wrote:
Hi,
In a multi-threaded application, I encountered problems with dates
being "reset" to 1970, or being negative when converted into ms since
1970.
I use Calendar to do operations on dates, and as I see no obvious bug
in the code, and as the problem occurs randomly and after a certain
time, I was wondering if that was a multi-threading issue.
So the question is: Is Calendar.getInstance() thread safe?
It would be odd as hell for a static factory method not to be thread-safe.
But since this isn't documented anywhere, let's have a look at the source
code (for 1.5.0_16-b02):
public static Calendar getInstance()
{
Calendar cal = createCalendar(TimeZone.getDefaultRef(),
Locale.getDefault());
cal.sharedZone = true;
return cal;
}
private static Calendar createCalendar(TimeZone zone,
Locale aLocale)
{
// If the specified locale is a Thai locale, returns a
BuddhistCalendar
// instance.
if ("th".equals(aLocale.getLanguage())
&& ("TH".equals(aLocale.getCountry()))) {
return new sun.util.BuddhistCalendar(zone, aLocale);
}
// else create the default calendar
return new GregorianCalendar(zone, aLocale);
}
Not much doubt that it always returns a newly constructed one. If the
version you're using might return the same Calendar twice, it has a pretty
significant bug in it.