commit df9abfe9a0776cc0952ce098fbefc8e931fd2654 Author: Karsten Loesing karsten.loesing@gmx.net Date: Thu Apr 17 20:33:37 2014 +0200
Don't share SimpleDateFormat instance which is not thread-safe.
When we moved date parsing and formatting to a util class in 14a6e59, we didn't think of thread-safety of the SimpleDateFormat class. Turns out it's *not* thread-safe.
The hot fix is to create a new SimpleDateFormat instance for each request.
A better solution might be to share a single instance per date format and thread, or to share an instance of a thread-safe SimpleDateFormat alternative per date format. Added these as TODOs.
Fixes #11516. --- src/org/torproject/onionoo/DateTimeHelper.java | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/src/org/torproject/onionoo/DateTimeHelper.java b/src/org/torproject/onionoo/DateTimeHelper.java index ff61423..4158894 100644 --- a/src/org/torproject/onionoo/DateTimeHelper.java +++ b/src/org/torproject/onionoo/DateTimeHelper.java @@ -5,8 +5,6 @@ package org.torproject.onionoo; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.HashMap; -import java.util.Map; import java.util.TimeZone;
public class DateTimeHelper { @@ -42,17 +40,15 @@ public class DateTimeHelper {
public static final String DATEHOUR_NOSPACE_FORMAT = "yyyy-MM-dd-HH";
- private static Map<String, DateFormat> dateFormats = - new HashMap<String, DateFormat>(); - private static DateFormat getDateFormat(String format) { - DateFormat dateFormat = dateFormats.get(format); - if (dateFormat == null) { - dateFormat = new SimpleDateFormat(format); - dateFormat.setLenient(false); - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - dateFormats.put(format, dateFormat); - } + /* TODO We're creating a new SimpleDateFormat instance here, because + * we can't share a single instance per date format between multiple + * threads. A better solution would be to share a single instance per + * date format and thread, or to share an instance of a thread-safe + * alternative per date format. */ + DateFormat dateFormat = new SimpleDateFormat(format); + dateFormat.setLenient(false); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); return dateFormat; }