`
Tristan_S
  • 浏览: 378115 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ThreadLocal 解决 多线程问题

 
阅读更多
不仅在客户端, 在服务器端也会有类似问题, 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;
  }
}
分享到:
评论

相关推荐

    ThreadLocal:如何优雅的解决SimpleDateFormat多线程安全问题

    目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型(format)SimpleDateFormat出现bug的原因如何解决SimpleDateFormat多线程安全问题局部变量使用...

    Java ThreadLocal详解_动力节点Java学院整理

    3. 线程安全:ThreadLocal可以解决多线程编程中的线程安全问题,但是需要正确地使用ThreadLocal来避免线程安全问题。 ThreadLocal是一种非常有用的机制,可以解决多线程编程中的线程安全问题,但是需要正确地使用...

    Java多线程 之 临界区、ThreadLocal.docx

    Java多线程编程中,临界区和ThreadLocal是两种重要的并发控制机制,它们用于解决多线程环境下的数据安全问题。 1. **临界区(Critical Section)** 临界区是指一段代码,它在同一时刻只允许一个线程进行访问。在...

    ThreadLocal

    ThreadLocal是Java编程语言中的一个类,用于在多线程环境中提供线程局部变量。它是一种特殊类型的变量,每个线程都有自己的副本,互不影响,从而实现线程间数据隔离。ThreadLocal通常被用来解决线程共享数据时可能...

    C# 高效线程安全,解决多线程写txt日志类.zip

    "C# 高效线程安全,解决多线程写txt日志类.zip" 提供了一个专门用于多线程环境下写入txt日志文件的解决方案,确保了在并发写入时的数据一致性与程序稳定性。 首先,我们要理解什么是线程安全。线程安全是指当多个...

    ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案.docx

    3. 不具有多线程之间共用数值的特性,只存在于单个线程内,主子线程之间不会出现值传递。 ThreadLocal 中的内存泄漏问题: ThreadLocal 被 ThreadLocalMap 中的 entry 的 key 弱引用,如果出现 GC 的情况时,...

    Java单线程ThreadLocal串值问题解决方案

    它可以使得每个线程都拥有自己的变量副本,从而避免了多线程环境下的变量竞争问题。 ThreadLocal的使用 在Java中,ThreadLocal可以通过ThreadLocal类的实例来实现线程间隔离的变量访问。例如,在示例代码中,我们...

    ThreadLocal原理及在多层架构中的应用.pdf

    在Java中,ThreadLocal被广泛应用于Web中间件、服务端编程和微服务架构中,用以解决多线程环境下的数据隔离问题。 首先,ThreadLocal原理是基于每个线程创建一个私有的数据存储结构(ThreadLocalMap),使得线程...

    ThreadLocal应用示例及理解

    - ThreadLocal不是线程同步机制,不能用来解决多个线程访问共享资源的问题。 - 不要将ThreadLocal用作全局变量,否则可能导致内存泄漏。 - 使用ThreadLocal时,要特别注意线程结束后的清理工作,防止内存泄漏。 - ...

    ThreadLocal原理及在多层架构中的应用

    综上所述,ThreadLocal是Java多线程编程中的一个重要工具,合理使用能解决许多并发问题,但同时也需要注意其潜在的风险。在多层架构中,ThreadLocal可以有效地提高代码的可读性和性能,但也需要谨慎使用,遵循最佳...

    Hibernate用ThreadLocal模式(线程局部变量模式)管理Session

    总的来说,ThreadLocal模式在Hibernate中用于管理Session,解决了多线程环境下Session的共享问题,实现了线程间的隔离,提高了系统的稳定性和效率。通过合理地使用ThreadLocal,开发者可以构建出更高效、更安全的多...

    day18 10.使用ThreadLocal来解决问题

    ThreadLocal通常用于解决多线程环境中的数据隔离问题,避免了线程之间的数据共享,从而简化了并发编程。 **ThreadLocal的工作原理** ThreadLocal维护了一个线程局部存储的映射表,其中键是ThreadLocal实例,值是...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行

    在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能编程...通过分析和运行这些实例,开发者可以深入理解多线程在实际项目中的运用,提升解决问题的能力。

    Java ThreadLocal 线程安全问题解决方案

    Java中的ThreadLocal是解决线程安全问题的一个重要工具,它提供了一种在多线程环境下为每个线程维护独立变量副本的方法,从而避免了共享状态带来的竞态条件和线程安全问题。 线程安全问题通常由全局变量和静态变量...

    设计模式及ThreadLocal资料

    ThreadLocal常用于解决多线程环境下数据隔离的问题,例如HTTP请求上下文、数据库连接等。 ThreadLocal的使用需要注意内存泄漏问题,当线程结束但ThreadLocal引用未清除时,可能会导致内存泄露。因此,使用...

    ThreadLocal垮线程池传递数据解决方案.docx

    TransmittableThreadLocal 是一种强大的ThreadLocal解决方案,能够解决跨线程池之间的数据传递问题,提高了系统的灵活性和可扩展性。 知识点: 1 ThreadLocal 的局限性:ThreadLocal 不能解决跨线程池之间的数据...

    java事务 - threadlocal

    ThreadLocal通常用来解决多线程环境下,需要每个线程保持独立状态的问题。例如,每个线程可以有自己的日志记录器实例,避免在并发环境中频繁地同步共享资源。ThreadLocal的使用方法是创建一个ThreadLocal实例,然后...

Global site tag (gtag.js) - Google Analytics