`

使用ThreadLocal保证DateFormat线程安全

    博客分类:
  • Java
阅读更多
大家都知道DateFormat是线程非安全的, 一般在多线程环境下, 必须为每一次日期时间的转换创建一个DateFormat, 这里有一个更高效的做法:
package com.javacodegeeks.test;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ConcurrentDateFormatAccess {

 private ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat> () {

  @Override
  public DateFormat get() {
   return super.get();
  }

  @Override
  protected DateFormat initialValue() {
   return new SimpleDateFormat("yyyy MM dd");
  }

  @Override
  public void remove() {
   super.remove();
  }

  @Override
  public void set(DateFormat value) {
   super.set(value);
  }

 };

 public Date convertStringToDate(String dateString) throws ParseException {
  return df.get().parse(dateString);
 }

}

分享到:
评论
1 楼 黑猪王子 2012-04-06  
貌似这种方法是通用的   用ThreadLocal解决线程安全问题

相关推荐

    DateFormat多线程问题

    `DateFormat`可以使用`ThreadLocal`来创建线程本地实例,确保每个线程都有自己独立的格式化对象,避免线程安全问题。示例代码如下: ```java ThreadLocal&lt;DateFormat&gt; threadLocalDateFormat = new ThreadLocal...

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

    在`ThreadLocalDateUtil`类中,我们创建了一个`ThreadLocal&lt;DateFormat&gt;`实例,当线程首次调用`getDateFormat()`时,会创建一个新的`SimpleDateFormat`实例,并将其存储在ThreadLocal中,后续该线程再次调用时,将...

    Java DateFormat并发实现

    然而,`DateFormat`并不是线程安全的,这意味着在多线程环境中直接使用可能会导致数据不一致或者异常。这篇博客文章《Java DateFormat并发实现》探讨了这个问题以及如何在并发环境下正确地使用`DateFormat`。 `...

    Java SimpleDateFormat线程安全问题原理详解

    如果需要在多线程环境下使用SimpleDateFormat,可以使用ThreadLocal或FastDateFormat确保线程安全。 Java SimpleDateFormat线程安全问题是Java开发中一个常见的问题。通过使用ThreadLocal或FastDateFormat,我们...

    Java多线程编程中使用DateFormat类

    2. **使用ThreadLocal**:另一种方式是使用`ThreadLocal`来为每个线程提供独立的`DateFormat`实例。`ThreadLocal`变量为每个线程维护了单独的副本,因此它们之间不会相互干扰。这种方法通常比同步更高效,因为它消除...

    深入理解Java:SimpleDateFormat安全的时间格式化

    但是,如果使用不小心会导致非常微妙和难以调试的问题,因为DateFormat和SimpleDateFormat类不是线程安全的。在多线程环境下调用format()和parse()方法应该使用同步代码来避免问题。 知识点1: SimpleDateFormat的非...

    Java在并发环境中SimpleDateFormat多种解决方案

    要在高并发环境下能有比较好的体验,可以使用ThreadLocal来限制SimpleDateFormat只能在线程内共享,这样就避免了多线程导致的线程安全问题。 ```java private static ThreadLocal&lt;DateFormat&gt; threadLocal = new ...

    Java面试题汇总及答案

    2. **使用 ThreadLocal**:使用`ThreadLocal`来维护每个线程的私有`SimpleDateFormat`实例,避免线程间的干扰。 示例代码: ```java private static final ThreadLocal&lt;DateFormat&gt; LOCAL_DATE_FORMAT = new ...

    获取当前时间

    例如,可以通过使用 `ThreadLocal` 来缓存每个线程的 `DateFormat` 实例。 4. **安全性问题**: - 当从不可信源获取日期和时间字符串时,使用 `DateFormat.parse(String source)` 解析可能存在安全风险。攻击者...

    Java定时器Timer使用方法详解

    TimeUtil类是一个时间转换工具类,保证线程安全,例如: public class TimeUtil{ public static final ThreadLocal&lt;DateFormat&gt; df = new ThreadLocal&lt;DateFormat&gt;() { @Override protected DateFormat initial...

    Java并发编程实战(中文版).7z

    6. **线程安全的类与设计模式**:探讨了线程安全的设计模式,如单例模式、双重检查锁定、生产者消费者模型等,并分析了一些内置的线程安全类,如DateFormat、ThreadLocal等。 7. **并发编程的最佳实践**:书中总结...

    疯狂JAVA讲义

    9.6.7 使用DateFormat格式化日期 352 9.7 本章小结 355 本章练习 355 第10章 异常处理 356 10.1 异常概述 357 10.2 异常处理机制 358 10.2.1 使用try...catch捕获异常 359 10.2.2 异常类的继承体系 360 ...

    字符串转日期

    3. **线程安全**:`SimpleDateFormat`不是线程安全的,因此在多线程环境下,应该为每个线程创建一个实例或者使用`ThreadLocal`来存储实例。 #### 五、最佳实践 1. **使用常量**:对于常用的日期格式,建议定义为...

    Java中SimpleDateFormat用法详解

    为了避免这个问题,可以在每个线程内部创建单独的实例,或者使用`ThreadLocal`来存储线程局部的`SimpleDateFormat`对象。 另外,Java 8引入了新的日期和时间API,如`java.time`包下的`DateTimeFormatter`,它比`...

    findbugs报告问题含义

    创建线程安全的日期格式化器,如使用 ThreadLocal。 26. **NP_NULL_PARAM_DEREF_NONVIRTUAL**:非虚拟方法调用传递了 null 参数。确保在调用方法前验证参数非 null。 27. **FI_EMPTY**:空的 finalizer 应该被删除...

    java格式化日期类

    在实际开发中,如果你不想每次都创建新的`SimpleDateFormat`实例,可以考虑使用`ThreadLocal&lt;SimpleDateFormat&gt;`来存储线程局部的`SimpleDateFormat`,避免多线程环境下的同步问题。 总结起来,`java.text....

    JAVA6.0帮助文档

    5. **多线程**:Java 6.0的线程管理更加成熟,新增了`ThreadLocal`类,提供线程局部变量,减少了数据同步的复杂性。`ExecutorService`和`Future`接口提供了更高级的线程池管理。 6. **国际化**:`java.text`和`java...

    Java中的SimpleDateFormat使用详解

    需要注意的是,`SimpleDateFormat`不是线程安全的,因此在多线程环境中使用时,要么为每个线程创建独立的实例,要么使用`ThreadLocal`来存储实例。 此外,`SimpleDateFormat`也存在一些效率问题,因为它的解析过程...

Global site tag (gtag.js) - Google Analytics