类SimpleDateFormat主要负责日期转化与格式化,但在多线程的环境中,使用此类容易造成数据转换及处理的不准确,因为SimpleDateFormate是线程不安全的
那怎么样才能在多线程中使用SimpleDateFormate类进行日期的转换而不出问题呢?
最简单的办法就是哪个线程使用,就哪个线程生成一个SimpleDateFormate一个实例,然后该线程内部进行使用。
但这个方式不够优雅,不够吊炸天。
如果你有印象,其实ThreadLocal类能使线程绑定到指定的对象,使用该类可以解决多线程环境下SimpleDateFormate类处理的错误情况
- ThreadLocal是解决线程安全问题一个很好的思路,ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本,由于Key值不可重复,每一个“线程对象”对应线程的“变量副本”,而到达了线程安全。
- 通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问题提供了一种隔离机制。
- 使用ThreadLocal可以使对象达到线程隔离的目的。同一个ThreadLocal操作不同的Thread,实质是各个Thread对自己的变量操作。
相同点:
ThreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突。
不同点:
在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。
import java.text.SimpleDateFormat;
public class DateTools {
private static ThreadLocal<SimpleDateFormat> t1 = new ThreadLocal<SimpleDateFormat>();
public static SimpleDateFormat getSimpleDataFormate(String datePattern){
SimpleDateFormat sdf = null;
sdf = t1.get();
if(sdf == null){
sdf = new SimpleDateFormat(datePattern);
t1.set(sdf);
}
return sdf;
}
}
网友评论