Nov 1, 2010

Common Threading Error [SimpleDateFormat/DecimalFormat]

I have come across a common threading mistake related to Threading in JAVA[I did the same mistake too and spent quite a few sleepless nights thinking what is causing this weird behavior ]. This is related to the The java.text.*Format classes, in java these classes for the most part are NOT thread safe. This is stated in the java doc. Under high volume when the shared/static class is run in two different threads at the same time in the same JVM the data from one thread will be transferred to another thread. These issues most likely will not be reproducible due to timing and are extremely hard to debug .

The Issue
While creating formatters to be used in the java application many people declare the formatters as static elements. e.g.:
  • private static final SimpleDateFormat LOG_DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
  • private static final DecimalFormat LOG_AMOUNT_FORMAT = new DecimalFormat("###########0.00");


Solution/Fix

The same code that is thread safe can be written like so:
private static final String LOG_AMOUNT_FORMAT = "###########0.00";

then in your method create a new instance locally.
SimpleDateFormat dateFormatter = new SimpleDateFormat(LOG_AMOUNT_FORMAT);
String formattedDate = dateFormatter.format(myDate);


Hope this helps people avoid the horrible nightmares I had with this issue.

No comments:

Post a Comment