ThreadLocal源码分析_01 入门案例以及表层源码分析

1、ThreadLocal简介

  • ThreadLocal是一个全局对象,ThreadLocal是线程范围内变量共享的解决方案;ThreadLocal可以看作是一个map集合,key就是当前线程,value就是要存放的变量。eg如下:
// 声明一个ThreadLocal实例
ThreadLocal threadLocal = new ThreadLocal();
// 随机获取一个数字n
int n = new Random().nextInt();
// 存放数据n给threadLocal:
threadLocal.set(data);
// 从threadLocal中取出数据n
threadLocal.get();
  • ThreadLocal的引用变量用完后会自动给你销毁,而不用考虑ThreadLocal中的变量会占用空间。
  • 在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的key为线程对象,value为对应的线程的变量副本。
  • ThreadLocal的作用:
    • ThreadLocal通过为每一个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。
    • 传递数据:可以通过ThreadLocal在同一线程的不同组件中传递公共变量。
    • 线程隔离:每个线程的变量都是独立的,不会相互影响。

2、入门案例

/**ThreadLocal通过为每一个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。
 * @author csp1999
 * @date 2021/02/21
 */
public class ThreadLocalTest {
   
   
    /**
     * 原子整数,一个分配给线程的 Thread ID
     */
    private static final AtomicInteger nextId = new AtomicInteger(0);

    /**
     * 每一个线程对应一个 Thread ID
     */
    private static final ThreadLocal<Integer> threadId = new ThreadLocal<Integer>() {
   
   
        /**
         * 初始化一个nextId的值
         * @return
         */
        @Override
        protected Integer initialValue() {
   
   
            // nextId自增
            return nextId.getAndIncrement();
        }
    };

    /**
     * 返回当前线程对应的Thread ID,必要时会进行分配!
     *
     * @return
     */
    public static int get() {
   
   
        return threadId.get();
    }

    static class RunnableTask implements Runnable {
   
   

        @Override
        public void run() {
   
   
            try {
   
   
                System.out.println(
                        "当前线程名称为:" + Thread.
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

路 飞

你的鼓励将是我创作的最大动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值