JUC —— ThreadLocal 的理解与使用

注意,下面我使用了线程池进行测试,实际开发的使用,要加上remove方式,不然会造成内存溢出的现象

package com.pengshi.ThreadTest;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * ThreadLocal查看源码可以知道,每个Thread里面带有ThreadLocalMap
 * 但是ThreadLocalMap是ThreadLocal的静态内部类,个人理解来说其实就是ThreadLocal 可以通过 其中的map进行定位,key为线程,value为需要传递的
 * 共享变量,所以假如单个ThreadLocal的创建后,可以使用initialValue 和set进行值的加入,
 * 同时我们可以知道整个操作逻辑,是在有一个线程调用的时候,使用了get方法进行获取对象,
 *  流程是 get方法 会查询 当前运行的线程Thread中map是否存在,不存在创建map,同时加入key为当前ThreadLocal,value为 我们设置的共享值,相当于
 *  每个线程创建了一个副本,可以进行使用
 *  注意:key 是 ThreadLocal , value 是 我们要缓存的对象
 *  一般来说 ThreadLocal 生命时候我们就可以注入我们需要缓存的对象了
 *  所以Thread中ThreadLocalMap中 缓存了 所有Thread Local的 对象的对象,需要的时候,直接使用 对象ThreadLocal的get方法就可以调用出来了
 * set 方式的使用 主要是应对 可变化的变量,可以自行设计其中的方法
 * 描述:
 * 利用ThreadLocal,给每个线程分配自己的dateFormat对象,保证了线程安全,高效利用内存
 * ThreadLocal 相当于 一个副本,线程需要的时候,进行获取调用
 * 这里主要是 withInitial 的知识点,要知道这个是 第一次使用的加载
 */
public class ThreadLocalNormalUsage05 {

    public static ExecutorService threadPool = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 1000; i++) {
            int finalI = i;
            threadPool.submit(() -> {
                String date = new ThreadLocalNormalUsage05().date(finalI);
                System.out.println(date);
            });
        }
        threadPool.shutdown();
    }

    public String date(int seconds) {
        //参数的单位是毫秒,从1970.1.1 00:00:00 GMT计时
        Date date = new Date(1000 * seconds);
//        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        ThreadSafeFormatter.dateFormatThreadLocal.set(ThreadSafeFormatter.simpleDateFormat);
        SimpleDateFormat dateFormat = ThreadSafeFormatter.dateFormatThreadLocal.get();
        return dateFormat.format(date);
    }
}

class ThreadSafeFormatter {
    static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static ThreadLocal<SimpleDateFormat> dateFormatThreadLocal = new ThreadLocal<>();

    public static ThreadLocal<SimpleDateFormat> dateFormatThreadLocal2 = ThreadLocal
            .withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pengshi12138

加油加油

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值