`

使用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讲义

    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