I would suggest to use ThreadLocal instead of overriding SimpleDateFormat.
Something like this:
private static final ThreadLocal LOCAL_DATE_FORMAT = new ThreadLocal() {
protected Object initialValue() {
return new SimpleDateFormat("yyyyMMddHHmmss");
};
};
public static SimpleDateFormat getDateFormat() {
return (SimpleDateFormat) LOCAL_DATE_FORMAT.get();
}
On Tue, Aug 17, 2010 at 8:11 AM, Charles O'Farrell <[email protected]> wrote:
> Hi Ivy Devs,
>
> Sorry to bother you, but we've run into some annoying issues with Ivy
> and concurrency (using ant parallel). For some unbelievably stupid
> reason SimpleDateFormat isn't thread safe.
>
> http://download-llnw.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html#synchronization
>
> Please find below a patch which illustrates one possible fix. I can
> imagine you might want to do something completely different, this is
> more of a show of good faith. Please let me know if you need me to
> raise a Bug and/or submit a different patch.
>
> Cheers,
>
> Charles
>
> diff --git a/src/java/org/apache/ivy/Ivy.java
> b/src/java/org/apache/ivy/Ivy.java
> index 3d9d8cd..608b364 100644
> --- a/src/java/org/apache/ivy/Ivy.java
> +++ b/src/java/org/apache/ivy/Ivy.java
> @@ -24,6 +24,7 @@ import java.net.URL;
> import java.text.ParseException;
> import java.text.SimpleDateFormat;
> import java.util.Collection;
> +import java.util.Date;
> import java.util.Iterator;
> import java.util.List;
> import java.util.Map;
> @@ -129,8 +130,24 @@ public class Ivy {
>
> private static final int KILO = 1024;
>
> - public static final SimpleDateFormat DATE_FORMAT = new
> SimpleDateFormat("yyyyMMddHHmmss");
> -
> + public static final ThreadSafeDateFormat DATE_FORMAT = new
> ThreadSafeDateFormat("yyyyMMddHHmmss");
> +
> + public static class ThreadSafeDateFormat {
> + private final String format;
> +
> + public ThreadSafeDateFormat(String format) {
> + this.format = format;
> + }
> +
> + public Date parse(String date) throws ParseException {
> + return new SimpleDateFormat(format).parse(date);
> + }
> +
> + public String format(Date date) {
> + return new SimpleDateFormat(format).format(date);
> + }
> + }
> +
> /**
> * the current version of Ivy, as displayed on the console when
> * Ivy is initialized
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]