不仅在客户端, 在服务器端也会有类似问题, servlet是多线程的, 调用后台的service层也是多线程的,如果service层中静态的,或是单例的 成员变量有多线程安全问题,就像 SimpleDataFormat 一样就会出现 取得的日期错误。
---------------------------------
在 log-services 项目中 用多线程来从不同ip下载,解析日志会出现异常。
在使用SimpleDataFormat parse 时, 会出现 NumberFormatException: For input string: ""
原因是SimpleDataFormat 是非线程安全的, 而我代码中的CommonService类中将其作为成员变量使用, 看源代码中 SimpleDataFormat 是 DateFormat的子类, DateFormat中定义了一个 Calendar, 在SimpleDataFormat 中有set(...) get(...)方法, 线程不安全。
参考
http://stackoverflow.com/questions/4021151/java-dateformat-is-not-threadsafe-what-does-this-leads-to
DateFormat exposes a calendar field of type Calendar, and looking at the code of SimpleDateFormat, some methods call calendar.set(...) and others call calendar.get(...). This is clearly not thread-safe.
解决方法
1, 不使用SimpleDataFormat 的成员变量, 改成零时变量
2, 在所有用到SimpleDataFormat 的地方都加上synchronized
3, 使用ThreadLocal
推荐使用使用ThreadLocal
public class DateFormatTest {
private static final ThreadLocal<DateFormat> df
= new ThreadLocal<DateFormat>(){
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyyMMdd");
}
};
public Date convert(String source)
throws ParseException{
Date d = df.get().parse(source);
return d;
}
}
分享到:
相关推荐
目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型(format)SimpleDateFormat出现bug的原因如何解决SimpleDateFormat多线程安全问题局部变量使用...
3. 线程安全:ThreadLocal可以解决多线程编程中的线程安全问题,但是需要正确地使用ThreadLocal来避免线程安全问题。 ThreadLocal是一种非常有用的机制,可以解决多线程编程中的线程安全问题,但是需要正确地使用...
Java多线程编程中,临界区和ThreadLocal是两种重要的并发控制机制,它们用于解决多线程环境下的数据安全问题。 1. **临界区(Critical Section)** 临界区是指一段代码,它在同一时刻只允许一个线程进行访问。在...
ThreadLocal是Java编程语言中的一个类,用于在多线程环境中提供线程局部变量。它是一种特殊类型的变量,每个线程都有自己的副本,互不影响,从而实现线程间数据隔离。ThreadLocal通常被用来解决线程共享数据时可能...
"C# 高效线程安全,解决多线程写txt日志类.zip" 提供了一个专门用于多线程环境下写入txt日志文件的解决方案,确保了在并发写入时的数据一致性与程序稳定性。 首先,我们要理解什么是线程安全。线程安全是指当多个...
3. 不具有多线程之间共用数值的特性,只存在于单个线程内,主子线程之间不会出现值传递。 ThreadLocal 中的内存泄漏问题: ThreadLocal 被 ThreadLocalMap 中的 entry 的 key 弱引用,如果出现 GC 的情况时,...
它可以使得每个线程都拥有自己的变量副本,从而避免了多线程环境下的变量竞争问题。 ThreadLocal的使用 在Java中,ThreadLocal可以通过ThreadLocal类的实例来实现线程间隔离的变量访问。例如,在示例代码中,我们...
在Java中,ThreadLocal被广泛应用于Web中间件、服务端编程和微服务架构中,用以解决多线程环境下的数据隔离问题。 首先,ThreadLocal原理是基于每个线程创建一个私有的数据存储结构(ThreadLocalMap),使得线程...
- ThreadLocal不是线程同步机制,不能用来解决多个线程访问共享资源的问题。 - 不要将ThreadLocal用作全局变量,否则可能导致内存泄漏。 - 使用ThreadLocal时,要特别注意线程结束后的清理工作,防止内存泄漏。 - ...
综上所述,ThreadLocal是Java多线程编程中的一个重要工具,合理使用能解决许多并发问题,但同时也需要注意其潜在的风险。在多层架构中,ThreadLocal可以有效地提高代码的可读性和性能,但也需要谨慎使用,遵循最佳...
总的来说,ThreadLocal模式在Hibernate中用于管理Session,解决了多线程环境下Session的共享问题,实现了线程间的隔离,提高了系统的稳定性和效率。通过合理地使用ThreadLocal,开发者可以构建出更高效、更安全的多...
ThreadLocal通常用于解决多线程环境中的数据隔离问题,避免了线程之间的数据共享,从而简化了并发编程。 **ThreadLocal的工作原理** ThreadLocal维护了一个线程局部存储的映射表,其中键是ThreadLocal实例,值是...
在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能编程...通过分析和运行这些实例,开发者可以深入理解多线程在实际项目中的运用,提升解决问题的能力。
Java中的ThreadLocal是解决线程安全问题的一个重要工具,它提供了一种在多线程环境下为每个线程维护独立变量副本的方法,从而避免了共享状态带来的竞态条件和线程安全问题。 线程安全问题通常由全局变量和静态变量...
ThreadLocal常用于解决多线程环境下数据隔离的问题,例如HTTP请求上下文、数据库连接等。 ThreadLocal的使用需要注意内存泄漏问题,当线程结束但ThreadLocal引用未清除时,可能会导致内存泄露。因此,使用...
TransmittableThreadLocal 是一种强大的ThreadLocal解决方案,能够解决跨线程池之间的数据传递问题,提高了系统的灵活性和可扩展性。 知识点: 1 ThreadLocal 的局限性:ThreadLocal 不能解决跨线程池之间的数据...
ThreadLocal通常用来解决多线程环境下,需要每个线程保持独立状态的问题。例如,每个线程可以有自己的日志记录器实例,避免在并发环境中频繁地同步共享资源。ThreadLocal的使用方法是创建一个ThreadLocal实例,然后...