ThreadLocal

本文通过一个具体的多线程示例,深入讲解了ThreadLocal的工作原理及其在Java中的使用方式。展示了如何利用ThreadLocal确保每个线程拥有独立的变量副本,避免线程间的数据干扰。

面试:情节是ThreadLocal的原理

ThreadLocal内部包含一个TheadLocalMap,key为各个线程的变量,value为要存储的对象,这样线程中的变量不被其他线程干扰。

 

public class ThreadLoal {
    public static void main(String[] args) {
        new Thread(()->{
            Message msg = new Message();
            msg.setInfo("NiHaoA");
            Chanel chanel = new Chanel();
            chanel.setMessage(msg);
            chanel.send();
        },"线程A").start();

        new Thread(()->{
            Message msg = new Message();
            msg.setInfo("NiHaoB");
            Chanel chanel = new Chanel();
            chanel.setMessage(msg);
            chanel.send();
        },"线程B").start();

        new Thread(()->{
            Message msg = new Message();
            msg.setInfo("NiHaoC");
            Chanel chanel = new Chanel();
            chanel.setMessage(msg);
            chanel.send();
        },"线程C").start();
    }
}


//每个线程进入Chanel类获取相应的message对象
class Chanel{
    //private static Message message;//satic表示message对象由Chanel类管理,即使多个Chanle只会对应一个message
    private static ThreadLocal<Message> threadLocal = new ThreadLocal<>();
    public void setMessage(Message message){
        //this.message = message;
        threadLocal.set(message);
    }

    public void send(){
        //System.out.println(Thread.currentThread().getName()+message.getInfo());
        System.out.println(Thread.currentThread().getName()+threadLocal.get().getInfo());
    }
}

class Message {
    private String info;
    public Message(){}

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
}

运行结果:

线程BNiHaoB
线程ANiHaoA
线程CNiHaoC
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值