ThreadLocal线程局部变量

本文通过示例展示了如何在Java中使用ThreadLocal实现线程局部变量,介绍了其原理并模拟ThreadLocal的工作机制。重点讲解了线程间数据隔离的特点和Spring中Connection的ThreadLocal应用场景。
package demo.thread;

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

//ThreadLocal方法演示
public class ThreadLocal线程局部变量 {
    @Test
    public void demo() {
        //共享资源String
        final ThreadLocal<String> threadLocal = new ThreadLocal<>();

        threadLocal.set(Thread.currentThread().getName() + ": 线程存入的字符串");
        System.out.println(threadLocal.get());
        //移除字符串
        threadLocal.remove();

        new Thread() {
            @Override
            public void run() {
                threadLocal.set(Thread.currentThread().getName() + ": 线程存入的字符串");
                System.out.println(threadLocal.get());
            }
        }.start();

        System.out.println("main线程移除后的字符串: " + threadLocal.get());
    }
}

/**
 * 模拟ThreadLocal
 * <p>
 * ThreadLocal内部其实是个Map来保存数据。
 * 虽然在使用ThreadLocal时只给出了值,没有给出键,其实它内部使用了当前线程做为键。
 */
class ThreadLocalSimulation<T> {
    // 使用当前线程做key
    private Map<Thread, T> threadTMap = new HashMap<>();

    public void set(T data) {
        threadTMap.put(Thread.currentThread(), data);
    }

    public T get() {
        return threadTMap.get(Thread.currentThread());
    }

    public void remove() {
        threadTMap.remove(Thread.currentThread());
    }
}

/**
 * ThreadLocal通常用在一个类的成员上
 * 多个线程访问它时,每个线程都有自己的副本,互不干扰!
 * Spring中把Connection放到了ThreadLocal中!
 */
class User {
    private ThreadLocal<String> usernameTl = new ThreadLocal<String>();
    //...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值