ThreadLocal设计是为了解决并发时,线程共享变量的问题,由于过度设计,如弱引用和哈希碰撞,导致其令人难以理解和使用成本高等问题。除此之外,使用稍有不慎还会造成脏数据和内存泄漏,共享变量更新等问题。但即便如此,ThreadLocal依然有自己的适用场景,以及无可取代的价值,比如接下来要介绍的这两种使用场景,除了
ThreadLocal
之外,还真没有合适的替代方案。
使用场景1:本地变量
我们以多线程格式化时间为例,来演示 ThreadLocal
的价值和作用,当我们在多个线程中格式化时间时,通常会这样操作。
- 当有两个线程进行时间格式化时,我们可以这样写:
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args) throws InterruptedException {
// 创建并启动线程1
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// 得到时间对象
Date date = new Date(1 * 1000);
// 执行时间格式化
formatAndPrint(date);
}
});
t1.start();
// 创建并启动线程2
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// 得到时间对象
Date date = new Date(2 * 1000);
// 执行时间格式化
formatAndPrint(date);
}
});
t2.start();
}
/**
* 格式化并打印结果
* @param date 时间对象
*/
private static void formatAndPrint(Date date) {
// 格式化时间对象
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");
// 执行格式化
String result = simpleDateFormat.format(date);
// 打印最终结果
System.out.println("时间:" + result