【问题标题】:Static method, static variable can it get mutated by multiple threads in web app - jsp静态方法,静态变量可以被Web应用程序中的多个线程变异 - jsp
【发布时间】:2012-11-24 14:30:47
【问题描述】:

我正在做这个项目。有一个类 DefaultsHelper 有:

    public  class DefaultsHelper {

    static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd") ;

    public static String getDate(int days)
    {
        GregorianCalendar c = new GregorianCalendar() ;
        c.setTime(new Date()) ;
        c.add(Calendar.DAY_OF_MONTH, days);
        return df.format(c.getTime()) ;

    }
}

在 Web 应用程序中 - 如果两个用户在查看 jsp 并同时调用 getDate 函数 - df 对象是否可能会变得不一致,从而无法返回预期值?

我认为 DefaultsHelper 是一个实用程序类,无需实例化新的 df 对象

【问题讨论】:

    标签: java multithreading jsp methods static


    【解决方案1】:

    您为每个线程创建一个新的Calendar,这很好,但您在多个线程中使用SimpleDateFormat。如果该类是线程安全的,那就没问题了,但它不是

    SimpleDateFormatnotorious for being thread-unsafe。只需为每次调用创建一个新的(即在方法中),或者更好的是,使用Joda-Time 来完全避免线程问题。

    关于创建一个格式化程序类作为优化的主题,这是过早优化和无意结果的经典示例。鉴于这是在 JSP 中,HTTP 请求/响应时间将使新格式化程序的实例化时间(和资源要求)相形见绌。使您的类线程安全且不可变,并在出现问题时担心优化。

    【讨论】:

    • 谢谢我认为可能是这种情况 - 我最好在这个方法中实例化一个新的 SimpleDateFormat 然后或者改变整个事情的工作方式!因为 dbase 中的时间都是这样写的,所以救了我一个坏人
    • 通过在应用程序中搜索 SimpleDateFormat 的静态实例,您将大大提高线程安全性!
    • 谢谢,太好了,我像这样改变了静态 - 看起来好吗?公共静态字符串 getDate(int days) { GregorianCalendar c = new GregorianCalendar() ; c.setTime(new Date()) ; SimpleDateFormat dft = new SimpleDateFormat("yyyy-MM-dd"); c.add(Calendar.DAY_OF_MONTH, 天);返回 dft.format(c.getTime()) ; }
    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多