ThreadLocal详细解答

Posted super码王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThreadLocal详细解答相关的知识,希望对你有一定的参考价值。

官方描述:ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是 private static 类型的,用于关联线程和线程上下文。

总结:

1、线程并发:在多线程并发场景下使用

2、传递数据:我们可以通过ThreadLocal在同一线程,不同组件中传递公共变量

3、线程隔离:每个线程的变量都是独立的,不会互相影响

基本使用

常用方法

使用案例

线程不隔离代码

package com.wustyq;

/**
 * 需求:线程隔离
 * 在多线程并发的场景下,每个线程中的变量都是相互独立的
 * 线程A:设置(变量1) 获取(变量1)
 * 线程B:设置(变量2) 获取(变量2)
 **/

public class MyDemo01 

    //变量
    private String content;

    public String getContent() 
        return content;
    

    public void setContent(String content) 
        this.content = content;
    

    public static void main(String[] args) 
        MyDemo01 demo = new MyDemo01();

        for (int i = 0; i < 5; i++) 
            Thread thread = new Thread(new Runnable() 
                @Override
                public void run() 
                    demo.setContent(Thread.currentThread().getName() + "的数据");
                    System.out.println("----------------------------");
                    System.out.println(Thread.currentThread().getName() + "--->" + demo.getContent());
                
            );

            thread.setName("线程" + i);
            thread.start();
        
    

运行效果:

----------------------------
----------------------------
线程1--->线程1的数据
线程0--->线程1的数据   ==> 数据错位
----------------------------
线程2--->线程2的数据
----------------------------
线程3--->线程3的数据
----------------------------
线程4--->线程4的数据

使用ThreadLocal的代码

package com.wustyq;

/**
 * 需求:线程隔离
 * 在多线程并发的场景下,每个线程中的变量都是相互独立的
 * 线程A:设置(变量1) 获取(变量1)
 * 线程B:设置(变量2) 获取(变量2)
 * <p>
 * ThreadLocal:
 * 1、set(): 将变量绑定到当前线程中
 * 2、get(): 获取当前线程绑定的变量
 **/

public class MyDemo01 
    ThreadLocal<String> t1 = new ThreadLocal<>();

    //变量
    private String content;

    public String getContent() 
        String s = t1.get();
        return s;
//        return content;
    

    public void setContent(String content) 
//        this.content = content;
        //变量content绑定到当前线程
        t1.set(content);
    

    public static void main(String[] args) 
        MyDemo01 demo = new MyDemo01();

        for (int i = 0; i < 5; i++) 
            Thread thread = new Thread(new Runnable() 
                @Override
                public void run() 
                    demo.setContent(Thread.currentThread().getName() + "的数据");
                    System.out.println("----------------------------");
                    System.out.println(Thread.currentThread().getName() + "--->" + demo.getContent());
                
            );

            thread.setName("线程" + i);
            thread.start();
        
    

运行结果展示

----------------------------
----------------------------
----------------------------
线程2--->线程2的数据
线程0--->线程0的数据
线程1--->线程1的数据
----------------------------
线程3--->线程3的数据
----------------------------
线程4--->线程4的数据

创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于ThreadLocal详细解答的主要内容,如果未能解决你的问题,请参考以下文章

史上最详细之ThreadLocal源码分析

详细的ThreadLocal以及与synchronized的区别

详细领悟ThreadLocal变量

ThreadLocal 应用原理解析与常见问题

各大公司Java面试题超详细总结

ThreadLocal之我所见