SimpleDateFormat is NOT immutable

Yes, SimpleDateFormat is not immutable as name may suggest. This came as complete surprise to me. When using from multiple threads then appeared exceptions like:

 java.lang.NumberFormatException: For input string: ""
 at java.lang.NumberFormatException.forInputString
 at java.lang.Long.parseLong(
 at java.lang.Long.parseLong(
 at java.text.DigitList.getLong(
 at java.text.DecimalFormat.parse(
 at java.text.SimpleDateFormat.subParse(
 at java.text.SimpleDateFormat.parse(
 at java.text.DateFormat.parse(

Quick check with documentation brought suspicion:

Date formats are not synchronized. It is recommended to create separate 
format instances for each thread. If multiple threads access a format 
concurrently, it must be synchronized externally.

Yes, it was enough to create per-thread SimpleDateFormat.

I think SimpleDateFormat is lousy name and also SimpleDateFormat breaks single responsibility principle. Much better would be decomposition into multiple classes:

  • SimpleDateFormat - immutable object only holding format of date
  • SimpleDateFormatter - mutable object used for formatting according to passed SimpleDateFormat
  • SimpleDataParser - mutable object used for parsing according to passed SimpleDateForma
Tags:  Java