大家都知道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);
}
}
分享到:
相关推荐
`DateFormat`可以使用`ThreadLocal`来创建线程本地实例,确保每个线程都有自己独立的格式化对象,避免线程安全问题。示例代码如下: ```java ThreadLocal<DateFormat> threadLocalDateFormat = new ThreadLocal...
在`ThreadLocalDateUtil`类中,我们创建了一个`ThreadLocal<DateFormat>`实例,当线程首次调用`getDateFormat()`时,会创建一个新的`SimpleDateFormat`实例,并将其存储在ThreadLocal中,后续该线程再次调用时,将...
然而,`DateFormat`并不是线程安全的,这意味着在多线程环境中直接使用可能会导致数据不一致或者异常。这篇博客文章《Java DateFormat并发实现》探讨了这个问题以及如何在并发环境下正确地使用`DateFormat`。 `...
如果需要在多线程环境下使用SimpleDateFormat,可以使用ThreadLocal或FastDateFormat确保线程安全。 Java SimpleDateFormat线程安全问题是Java开发中一个常见的问题。通过使用ThreadLocal或FastDateFormat,我们...
2. **使用ThreadLocal**:另一种方式是使用`ThreadLocal`来为每个线程提供独立的`DateFormat`实例。`ThreadLocal`变量为每个线程维护了单独的副本,因此它们之间不会相互干扰。这种方法通常比同步更高效,因为它消除...
但是,如果使用不小心会导致非常微妙和难以调试的问题,因为DateFormat和SimpleDateFormat类不是线程安全的。在多线程环境下调用format()和parse()方法应该使用同步代码来避免问题。 知识点1: SimpleDateFormat的非...
要在高并发环境下能有比较好的体验,可以使用ThreadLocal来限制SimpleDateFormat只能在线程内共享,这样就避免了多线程导致的线程安全问题。 ```java private static ThreadLocal<DateFormat> threadLocal = new ...
2. **使用 ThreadLocal**:使用`ThreadLocal`来维护每个线程的私有`SimpleDateFormat`实例,避免线程间的干扰。 示例代码: ```java private static final ThreadLocal<DateFormat> LOCAL_DATE_FORMAT = new ...
例如,可以通过使用 `ThreadLocal` 来缓存每个线程的 `DateFormat` 实例。 4. **安全性问题**: - 当从不可信源获取日期和时间字符串时,使用 `DateFormat.parse(String source)` 解析可能存在安全风险。攻击者...
TimeUtil类是一个时间转换工具类,保证线程安全,例如: public class TimeUtil{ public static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { @Override protected DateFormat initial...
6. **线程安全的类与设计模式**:探讨了线程安全的设计模式,如单例模式、双重检查锁定、生产者消费者模型等,并分析了一些内置的线程安全类,如DateFormat、ThreadLocal等。 7. **并发编程的最佳实践**:书中总结...
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. **使用常量**:对于常用的日期格式,建议定义为...
为了避免这个问题,可以在每个线程内部创建单独的实例,或者使用`ThreadLocal`来存储线程局部的`SimpleDateFormat`对象。 另外,Java 8引入了新的日期和时间API,如`java.time`包下的`DateTimeFormatter`,它比`...
创建线程安全的日期格式化器,如使用 ThreadLocal。 26. **NP_NULL_PARAM_DEREF_NONVIRTUAL**:非虚拟方法调用传递了 null 参数。确保在调用方法前验证参数非 null。 27. **FI_EMPTY**:空的 finalizer 应该被删除...
在实际开发中,如果你不想每次都创建新的`SimpleDateFormat`实例,可以考虑使用`ThreadLocal<SimpleDateFormat>`来存储线程局部的`SimpleDateFormat`,避免多线程环境下的同步问题。 总结起来,`java.text....
5. **多线程**:Java 6.0的线程管理更加成熟,新增了`ThreadLocal`类,提供线程局部变量,减少了数据同步的复杂性。`ExecutorService`和`Future`接口提供了更高级的线程池管理。 6. **国际化**:`java.text`和`java...
需要注意的是,`SimpleDateFormat`不是线程安全的,因此在多线程环境中使用时,要么为每个线程创建独立的实例,要么使用`ThreadLocal`来存储实例。 此外,`SimpleDateFormat`也存在一些效率问题,因为它的解析过程...