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详细解答的主要内容,如果未能解决你的问题,请参考以下文章