在多线程环境中使用DateFormat时使用synchronized关键字

时间:2013-05-16 08:19:38

标签: java multithreading simpledateformat indexoutofboundsexception

在多线程环境中使用DateFormat时在哪里使用synchronized关键字?

我低于Exception

java.lang.ArrayIndexOutOfBoundsException: -1

当我查看我的代码时,我有一个使用SimpleDateFormat格式化日期的方法。

public static synchronized String now(String dateFormat) {

            if (dateFormat.equalsIgnoreCase("")) {
                dateFormat = "yyyy-MM-dd'T'HH:mm:ss";
            }
            Calendar cal = Calendar.getInstance();
            SimpleDateFormat sdf = null;
            if (dateFormat == null || dateFormat.equalsIgnoreCase("")) {
                sdf = new SimpleDateFormat();
            } else {
                sdf = new SimpleDateFormat(dateFormat, Locale.getDefault());
            }
            return sdf.format(cal.getTime());

        }

虽然我无法重现异常,但这可能是我遇到java.lang.ArrayIndexOutOfBoundsException的地方,因为我找到了一个link来描述如何在多线程环境中使用DateFormatDateFormat未同步,因此在多线程环境中工作时可能会抛出java.lang.ArrayIndexOutOfBoundsException

但我的上述方法已经是synchronized方法了。

我的问题是:

静态方法可以是synchronized方法吗?

我是否需要同步SimpleDateFormat而不是synchronized方法的对象以及为什么?

1 个答案:

答案 0 :(得分:3)

上面显示的方法不会访问任何共享状态(DateFormat是作为局部变量创建的),因此您无需同步

您需要找到与您的异常相关联的堆栈跟踪。否则只是猜测工作。