相关疑难解决方法(0)

为什么Java的SimpleDateFormat不是线程安全的?

请告诉代码示例为什么SimpleDateFormat不是线程安全的.这堂课有什么问题? SimpleDateFormat的格式功能有问题吗?请给出一个在课堂上演示此错误的代码.

FastDateFormat是线程安全的.为什么?b/w SimpleDateFormat和FastDateFormat有什么区别?

请用解释此问题的代码解释一下?

java thread-safety simpledateformat

226
推荐指数
7
解决办法
14万
查看次数

在SimpleDateFormat和克隆上同步

我们知道dateformat类不是线程安全的.我有一个多线程场景,需要使用dateformats.我无法在新线程中创建新实例,因为SimpledateFormat创建似乎很昂贵(构造函数最终调用"编译",这是昂贵的).经过一些测试,我只剩下两个选项:

  1. 外部同步 - 我真的不想这样做
  2. 克隆每个线程 - 不知道是否有一些捕获?

有什么建议?

如果大家之前已经面对过这个问题,你会采取什么方向.

注意:之前曾问过一个类似的问题,但它被关闭指向一个apache包.我不能为此使用新库.我也在SO上读过这个类似的问题

java clone date-format thread-safety

15
推荐指数
1
解决办法
4165
查看次数

关于线程安全的困惑 - SimpleDateFormat示例

我有一个关于线程安全的问题.据我所知,SimpleDateFormat不是线程安全的.我想知道如果我在弹簧控制器中使用以下方式会有什么影响:

private final static SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd yyyy", Locale.US);
Run Code Online (Sandbox Code Playgroud)

稍后在我的控制器函数中,我使用它如下:

  try {
        changedate = changedate.substring(0, 15);                                                
        calcDate = dateFormat.parse(changedate);
    } catch (ParseException e2) {
        logger.error("Date Parsing Problem", e2); 
    }
Run Code Online (Sandbox Code Playgroud)

然后将calcDate添加到我的模型对象中,并返回ModelAndView.

那么我会用这种方式看到什么样的问题呢?简单地删除static关键字会修复任何问题,因为每个线程都会使用自己的dateFormat实例吗?关于线程安全性的任何关于线程安全性的清晰度都将非常受欢迎.

谢谢

java spring thread-safety

11
推荐指数
2
解决办法
7267
查看次数

java.text.SimpleDateFormat不是线程安全的

Synchronization

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally
Run Code Online (Sandbox Code Playgroud)

上面的行在SimpleDateFormat类的JavaDoc中提到.

这是否意味着我们不应该将SimpleDateFormat对象创建为Static.

如果我们将它创建为静态,那么无论我们在哪里使用这个对象,我们都需要将它保存在Synchronized Block中.

java thread-safety simpledateformat

8
推荐指数
3
解决办法
2万
查看次数

Servlet中的SimpleDateFormat

我在Servlet中使用了很多SimpleDateFormat对象.不幸的是,SimpleDateFormat不是线程安全的.因此,我考虑用ThreadLocal包装它以促进SimpleDateFormat对象的重用.我写了一个util-class来启用它:

public class DateUtil {
    private final static ThreadLocal<SimpleDateFormat> dateFormat = new ThreadLocal<SimpleDateFormat>() {
        return new SimpleDateFormat();
    }

    public static SimpleDateFormat get () {
        return dateFormat.get();
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,这似乎导致内存泄漏.关闭我的webapp时,Tomcat会记录以下错误消息:

严重:Web应用程序[]使用[null]类型的键创建了一个ThreadLocal(值[com.example.util.DateUtil$2@50242f7d]),类型为[java.text.SimpleDateFormat](value [java.text] .SimpleDateFormat @ d91b489b])但在Web应用程序停止时无法将其删除.这很可能造成内存泄漏.

我理解内存泄漏的原因,但是在Servlet中处理SimpleDateFormat-objects(或任何其他非线程安全对象)的最佳方法是什么?

java servlets thread-local simpledateformat

2
推荐指数
1
解决办法
2664
查看次数