将日历存储在常量字段中以便以后使用它,避免在方法内创建它

时间:2014-05-15 13:37:26

标签: java multithreading performance

以下代码有问题吗?

我想在执行百万次的进程中使用方法parseDateToInteger。可以以多线程方式访问此进程,因此我同步了该方法。我避免在方法中创建Calendar实例,因为它花费了宝贵的时间。但我不确定这种代码行为。使用此代码有什么问题吗?

private static final Calendar CALENDAR_BRASIL = GregorianCalendar.getInstance(LOCALE_BRASIL);


public synchronized static int parseDateToInteger(Date data) {
    CALENDAR_BRASIL.setTime(data);
    int ano = CALENDAR_BRASIL.get(Calendar.YEAR);
    int mes = CALENDAR_BRASIL.get(Calendar.MONTH)+1;
    int dia = CALENDAR_BRASIL.get(Calendar.DATE);
    return ano * 10000 + mes * 100 + dia;       
}

编辑: 我看到这篇文章让我害怕,但作者没有使用同步方法。

http://blog.bielu.com/2008/08/javautilcalendar-confusion-is-it-safe_28.html

1 个答案:

答案 0 :(得分:1)

这是一个坏主意。虽然您已经避免创建所有这些对象,但您现在拥有的方法一次只能由一个对象使用。因此,不是创建一百万个对象,而是部分并行,您将拥有必须等待轮到他们使用日历的进程。

只需为每个线程创建实例。