一、ThreadLocal简介(多个线程访问共享变量时,每个线程都Copy一份该变量的副本,存放在Thread.threadLocals变量中,避免共享变量被其他线程改变而导致所有线程访问的变量随着变化的问题,即线程不安全)
多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。
二、ThreadLocal简单使用
多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。
二、ThreadLocal简单使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public static ThreadLocal<String> localVar = new ThreadLocal<>(); static void print(String str) { //打印当前线程中本地内存中本地变量的值 System. out .println(str + " :" + localVar. get ()); //清除本地内存中的本地变量 localVar.remove(); } @Test public void test() { Thread t1 = new Thread(() -> { //设置线程1中本地变量的值 localVar. set ( "localVar1" ); //调用打印方法 print( "thread1" ); //打印本地变量 System. out .println( "after remove : " + localVar. get ()); }); Thread t2 = new Thread(() -> { //设置线程1中本地变量的值 localVar. set ( "localVar2" ); //调用打印方法 print( "thread2" ); //打印本地变量 System. out .println( "after remove : " + localVar. get ()); }); t1.start(); t2.start(); } |
结果
thread1 :localVar1
thread2 :localVar2
after remove : null
after remove : null
源码解析参考:https://www.jb51.net/article/214671.htm
分类:
Java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】