静态方法,静态变量可以被web app中的多个线程变异 - jsp

use*_*639 3 java methods static multithreading jsp

我正在研究这个项目.有一个类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()) ;

    }
}
Run Code Online (Sandbox Code Playgroud)

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

我认为DefaultsHelper是一个实用程序类,可以停止实例化新的df对象

Bri*_*new 5

你创建一个新的Calendar每个线程,这很好,但你正在使用SimpleDateFormat跨多个线程.如果该类是线程安全的,那就没问题,但事实并非如此.

SimpleDateFormat以线程不安全臭名昭着.只需为每次调用(即在方法中)创建一个新的,或者更好的是,使用Joda-Time完全避免线程问题.

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