当前位置: 首页 > news >正文

学习笔记-ThreadLocal

ThreadLocal

  1. 什么是ThreadLocal?
    ThreadLocal 是线程本地变量类,在多线程并行执行过程中,将变量存储在ThreadLocal中,每个线程中都有独立的变量,因此不会出现线程安全问题。

  2. 应用举例
    解决线程安全问题:例如每个线程都绑定一个数据库连接,避免多个线程访问同一个数据库连接:SqlSession
    跨函数参数传递:同一个线程,跨类,跨方法传递参数的时候可以使用ThreadLocal,每个线程绑定一个Token/Session

  3. 关于ThreadLocal
    1)一个线程只能有一个ThreadLocal吗?
    首先我们看到Thread里面,有一个ThreadLocalMap,可以看到再java1.8之后,每个线程都有自己的ThreadLocalMap
    在这里插入图片描述
    而这个ThreadLocalMap 里面可以明显的看到是一个数组用于存储多个Entry
    在这里插入图片描述
    我们看ThreadLocal的源码可以发现最终是调用ThreadLocalMap里面的方法:
    在这里插入图片描述
    createMap方法:
    在这里插入图片描述
    ThreadLocalMap里面的set方法:
    在这里插入图片描述
    关于ThreadLocalMap的哈希探测可以参考此文
    这篇文章写的非常的详细,更多的展示了源码的细节

  1. Entry 的 Key 为什么需要使用弱引用?如果是强引用会造成什么问题?
    因为弱引用在GC回收时会被回收,如果使用强引用,我们某个方法里面创建了一个ThreadLocal,我们肯定使用了new关键字,这个时候是强引用,如果这个方法结束,对于这个方法的引用应该解除并且回收掉,如果我们Entry里面使用强引用就会造成内存泄漏,这个已经ThreadLocal已经用不到了,但是由于key是强引用导致始终无法被回收掉。这样的话有资源一直回收不掉,堆积后最终就会OOM内存溢出。
  1. 使用案例(持续补充)
    1)传递共享参数
@Setter
public class DemoTask {private ThreadLocal threadLocal;public void execute() {// 对threadLoca的变量进行操作,只要是同一个ThreadLocal 一定是相同的值System.out.println(JSONUtil.toJsonStr(threadLocal.get()));}
}
public class ThreadLocalDemo {static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal();public void init() {threadLocal.set(new HashMap<String,Object>(){{put(  "k1", 1);put( "k2", "v");}});}public void passParms() {DemoTask demoTask = new DemoTask();demoTask.setThreadLocal(threadLocal);demoTask.execute();System.out.println(JSONUtil.toJsonStr(threadLocal.get()));}public static void main(String[] args) {ThreadLocalDemo threadDemo = new ThreadLocalDemo();threadDemo.init();threadDemo.passParms();}
}
http://www.lryc.cn/news/148422.html

相关文章:

  • python利用pandas统计分析—groupby()函数的使用
  • OPENCV实现ORB特征检测
  • W5100S-EVB-PICO主动PING主机IP检测连通性(十)
  • 使用 Nginx 搭建文件下载服务器
  • 链式栈StackT
  • Fiddler中 AutoResponder 使用
  • 77GHz线性调频连续波雷达
  • YOLOV8改进:更换为MPDIOU,实现有效涨点
  • BookStack开源免费知识库docker-compose部署
  • Linux:编译遇到 Please port gnulib freadahead.c to your platform ,怎么破
  • three.js(三):three.js的渲染结构
  • 客户端读写HBase数据库的运行原理
  • 不使用VH6501设备,通过VN1630等普通设备使用canConfigureBusOff函数进行busoff干扰测试
  • 服务器数据恢复-服务器RAID6硬盘故障离线的数据恢复案例
  • DB2 HADR+TSA运维,TSA添加资源组的命令
  • LeetCode-135-分发糖果
  • Viva Workplace Analytics Employee Feedback SU Viva Glint部署方案
  • ASIC-WORLD Verilog(14)系统任务
  • 两台电脑共享文件设置
  • 《C和指针》笔记17:sizeof
  • 说说大表关联小表
  • Unity 之 方括号[ ] 的用法以及作用
  • 微服务nacos或者yml配置内容部分加密jasypt
  • Vue:插槽,与自定义事件
  • Window11-Ubuntu双系统安装
  • 【React】React学习:从初级到高级(一)
  • Flutter 安装教程 + 运行教程
  • 正中优配:A股早盘三大股指微涨 华为概念表现活跃
  • SAP MM学习笔记26- SAP中 振替转记(转移过账)和 在库转送(库存转储)4- Plant间在库转送 之 在库转送Order(有出荷)
  • suricata规则字段解析