ThreadLocal

ThreadLocal是Java中的为解决多线程间数据隔离的解决方案,其底层依赖于Java的内存模型,依赖于当前执行线程的内存来完成对数据的存取操作。

一般在使用时,在对象中创建ThreadLocal泛型变量,在之后进行到调度时从中取出ThreadLoacal中存储的数据以便后续业务操作。

Class Data {
private ThreadLocal<String> threadLocal = new ThreadLocal<>();
}

ThreadLocal的API操作:

  1. T get(),返回存储在ThreadLocal中的数据,泛型
  2. Protected T initialValue(),创建ThreadLocal变量时设置默认值,在创建时重写实现
  private ThreadLocal<String> threadLocal = new ThreadLocal(){
@Override
protected String initialValue() {
//获取并返回默认值
return "默认值");
}
};
  1. void remove(),删除数据
  2. static ThreadLocal withInitial(Supplier<? extends T> supplier),同样是在创建ThreadLocal变量时设置默认初始值
    private ThreadLocal<String> threadLocal=
ThreadLocal.withInitial(new Supplier<String>() {
@Override
public String get() {
//返回默认值
return "默认值";
}
});

常见使用场景

  1. 代替参数传递

    在API接口传入参数到controller层之后,众多的参数时显示的到达实际业务处理层中,可以使用ThreadLocal来隐性的接收参数,在之后的业务处理是就不需要显示的了解传入的参数。缺点:不利于业务的理解,使用复杂
  2. 解析信息

    常用于存储用户登录信息,Session或者Token等。在用户登录时,使用拦截器将登录信息统一写入到ThreadLocal中,在后续调用到用户信息时,直接get,就无需进行查表、rpc或rest调用的步骤。缺点:仅使用于该信息不常变动的场景,如无状态登录
  3. 资源隔离

    对于Spring中的bean对象,默认装配的都是单例对象,其中的有些数据在多线程统一请求时,可能造成资源冲突,这时候就可以为其添加ThreadLocal变量,使得每个使用该单例bean对象的线程请求都有属于自己的变量分区。以Spring中DAO层连接数据库的connection为例,其与数据库连接的背后就使用了ThreadLocal。在线程请求连接数据库时,若ThreadLocal对象为null,则说明该线程没有获得数据库连接,否则就直接复用该连接。很好的起到了多线程之间资源隔离的效果。

ThreadLocal及常用场景的更多相关文章

  1. Git——常用场景解析

    总结:本篇文章从初识GitHub.Git,实践GitHub的五种常用场景,分别是:git for windows安装,git配置,克隆远程代码到本地,上传本地代码到远程以及Git的常用指令.相信Jam ...

  2. git常用命令常用场景

    在使用git之前,一直用的是svn版本管理:与svn最大不同的是,git有两个仓库,一个是本地仓库,一个是服务器上共享的仓库:本地仓库是每个开发者自己独有的,即使commit提交也只是提交到本地仓库: ...

  3. Intent 常用场景 FileProvider 拍照 裁剪 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. ThreadLocal的使用场景分析

    目录 一.ThreadLocal介绍 二.使用场景1——数据库事务问题 2.1 问题背景 2.2 方案1-修改接口传参 2.3 方案2-使用ThreadLocal 三.使用场景2——日志追踪问题 四. ...

  5. 超实用的 Nginx 极简教程,覆盖了常用场景

    概述 什么是 Nginx? Nginx (engine x) 是一款轻量级的 Web 服务器 .反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 什么是反向代理? 反向代理(Reverse ...

  6. ThreadLocal的使用场景及实现原理

    1. 什么是ThreadLocal? 线程局部变量(通常,ThreadLocal变量是private static修饰的,此时ThreadLocal变量相当于成为了线程内部的全局变量) 2. 使用场景 ...

  7. 超实用的Nginx极简教程,覆盖了常用场景

    概述 安装与使用 安装 使用 nginx 配置实战 http 反向代理配置 负载均衡配置 网站有多个 webapp 的配置 https 反向代理配置 静态站点配置 搭建文件服务器 跨域解决方案 参考 ...

  8. 超实用的 Nginx 极简教程,覆盖了常用场景(转)

    概述 安装与使用 安装 使用 nginx 配置实战 http 反向代理配置 负载均衡配置 网站有多个 webapp 的配置 https 反向代理配置 静态站点配置 搭建文件服务器 跨域解决方案 参考 ...

  9. cocos2dx 游戏开发中常用场景切换方式以及特性

    runWithScene(CCScene* scene):启动游戏,并运行scene 场景.这个方法在主程序启动时第一次启动主场景时调用.   replaceScene(CCScene* scene) ...

  10. ThreadLocal的使用场景:Web容器、Spring容器、日志打印

    一.对于HTTP事务的理解 一次HTTP请求,就是一个事务.事务者,必须完整的执行其中的所有步骤,不能中断. 二.HTTP事务的隔离 每次HTTP请求对应一个HTTP事务,而每个请求都对应一个线程,线 ...

随机推荐

  1. PyTorch复现AlexNet学习笔记

    PyTorch复现AlexNet学习笔记 一篇简单的学习笔记,实现五类花分类 这里只介绍复现的工作,如果想了解更多有关网络的细节,请去看论文<ImageNet Classification wi ...

  2. 通过surging的后台托管服务编写任务调度并支持规则引擎自定义脚本

    简介 过去,如果在业务中需要处理任务调度的时候,大家都会使用第三方的任务调度组件,而第三方组件有一套自己的规则,在微服务的中显得那么格格不入,这样就会造成代码臃肿,耦合性高,如果有分布式还需要搭建新的 ...

  3. C语言 根据掩码计算网段的起止ip

    原文地址:https://www.yuque.com/docs/share/85a26263-484a-42f6-880b-2b511ae1bd20?# 根据ipv4掩码计算 #include < ...

  4. 【Markdown编辑器】语法规则

    一.Markdown介绍及工具推荐 1.介绍 Markdown是一种轻量级标记语言,它以纯文本形式(易读.易写.易更改)编写文档,并最终以HTML格式发布.Markdown也可以理解为将以MARKDO ...

  5. HBase详解(05) - HBase优化 整合Phoenix 集成Hive

    HBase详解(05) - HBase优化 整合Phoenix 集成Hive HBase优化 预分区 每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维 ...

  6. 【Java复健指南15】链表LinkedList及其说明

    链表LinkedList by Java 之前有写过一些记录(引用),但是忘了乱了,现在重新梳理一遍 链表是Java中List接口的一种实现 定义(引用) 链表(linked list)是一种物理存储 ...

  7. test20230111考试总结 -2023寒图论专题

    前言 赛时得分情况: A B C D E F G H I \(\texttt{Total}\) \(\texttt{Rank}\) \(100\) \(100\) \(10\) \(58\) \(54 ...

  8. 洛谷P1496 火烧赤壁【题解】

    事先声明 本题解文字比较多,较为详细,算法为离散化和差分,如会的大佬可以移步去别处看这道题的思路(因为作者比较懒,不想新开两个专题). 题目简要 给定每个起火部分的起点和终点,请你求出燃烧位置的长度之 ...

  9. PWA-H5 Web App优化探索之路(Service Worker,Lighthouse)

    PWA是什么? Progressive Web App 渐进式web应用程序,简单来说,就是可以让你的WEB App,带来与原生App相媲美的用户体验.. 为什么要用PWA? 简单来说,是为了web应 ...

  10. angular--路由导航三种方法