ThreadLocal本地局部线程demo

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.HashMap;
import java.util.Map; /**
* 本工具只能保存一个线程内的变量
* 变量是同一个,但是每个线程都使用同一个初始值,也就是使用同一个变量的一个新的副本。这种情况之下ThreadLocal就非常使用,
* 比如说DAO的数据库连接,我们知道DAO是单例的,那么他的属性Connection就不是一个线程安全的变量。而我们每个线程都需要使用他,并且各自使用各自的。这种情况,ThreadLocal就比较好的解决了这个问题。
*
*/
public class ThreadLocalUtils {
private final static Logger LOG = LoggerFactory.getLogger(ThreadLocalUtils.class); private ThreadLocal<Map<String,String>> localValue = new ThreadLocal<Map<String, String>>(); private static ThreadLocalUtils singleton =new ThreadLocalUtils(); private ThreadLocalUtils(){
Object obj = localValue.get();
} private void addValue(String key,String value){
Map<String,String> maps = localValue.get();
if(maps==null){
localValue.set(new HashMap<String,String>());
}
localValue.get().put(key,value);
} /**
* 向日志辅助工具中放入需要输出的变量
*/ public static void addLog(String key,String value){
if(value!=null&&value.trim().length()>0) {
singleton.addValue(key, value);
}
} public static void removeLog() {
singleton.removeValue();
} public void removeValue() {
Map<String,String> maps = localValue.get();
if(null != maps) {
localValue.remove();
}
} public static Map<String,String> getAllLocalVariables(){
return singleton.localValue.get();
} /**
* 打印输出
*
* main,打印参数2:{test3=test333, test=test111} -->outer
* Thread-0,打印参数:{test2=test222} -->inner
* main,打印参数3:null -->outer
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
ThreadLocalUtils.addLog("test","test111"); Thread t= new Thread(new Runnable() {
@Override
public void run() {
ThreadLocalUtils.addLog("test2","test222"); System.out.println(Thread.currentThread().getName() + ",打印参数:" + ThreadLocalUtils.getAllLocalVariables()+" -->inner");
}
}); ThreadLocalUtils.addLog("test3","test333"); t.start(); // t.join();
/** 打开上面的这一行代码后的输出:
* Thread-0,打印参数:{test2=test222} -->inner
* main,打印参数2:{test3=test333, test=test111} -->outer
* main,打印参数3:null -->outer
*/ System.out.println(Thread.currentThread().getName() + ",打印参数2:" + ThreadLocalUtils.getAllLocalVariables()+" -->outer"); t.join(); ThreadLocalUtils.removeLog();
System.out.println(Thread.currentThread().getName() + ",打印参数3:" + ThreadLocalUtils.getAllLocalVariables()+" -->outer"); } }

ThreadLocal本地局部线程demo的更多相关文章

  1. Java 类 ThreadLocal 本地线程变量

    前言:工作中将要使用ThreadLocal,先学习总结一波.有不对的地方欢迎评论指出. 定义 ThreadLocal并不是一个Thread,而是Thread的局部变量.这些变量不同于它们的普通对应物, ...

  2. ThreadLocal本地线程变量的理解

     一般的Web应用划分为展现层.服务层和持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用.在一般情况下,从接收请求到返回响应所经过的所有程序调用都同属于一个线程.       ...

  3. ThreadLocal = 本地线程?

    一.定义 ThreadLocal是JDK包提供的,从名字来看,ThreadLocal意思就是本地线程的意思. 1.1 是什么? 要想知道他是个啥,我们看看ThreadLocal的源码(基于JDK 1. ...

  4. Java Concurrency - ThreadLocal, 本地线程变量

    共享数据是多线程应用最常见的问题之一,但有时我们需要为每个线程保存一份独立的变量.Java API 提供了 ThreadLocal 来解决这个问题. 一个 ThreadLocal 作用的例子: imp ...

  5. 线程系列5--java中的ThreadLocal类实现线程范围内的数据共享(二)

    ThreadLocal类可以理解成一个类似与map集合使用,以当前线程当做key 来使用,将线程氛围内需要共享的数据当做value,形成键值对的形式使用.ThreadLocal和线程同步机制都是为了解 ...

  6. ThreadLocal 解决simpledateformat线程不安全

    SimpleDateFormat在多线程情况下会出现线程不安全的情况,故用ThreadLoacl 处理/** * 用ThreadLocal处理simplDateFormat线程不安全 */public ...

  7. Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。

    Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离.

  8. JDBCToolsV2:利用ThreadLocal保证当前线程操作同一个数据库连接对象。

    JDBCToolsV2:     利用ThreadLocal保证当前线程操作同一个数据库连接对象. package com.dgd.test; import com.alibaba.druid.poo ...

  9. Flask中的ThreadLocal本地线程,上下文管理

    先说一下和flask没有关系的: 我们都知道线程是由进程创建出来的,CPU实际执行的也是线程,那么线程其实是没有自己独有的内存空间的,所有的线程共享进程的资源和空间,共享就会有冲突,对于多线程对同一块 ...

  10. ThreadLocal解析:父线程的本地变量不能传递到子线程详解

    众所周知,ThreadLocal类是java提供线程本地变量的工具类.但父线程的本地变量却不能被子线程使用,代码如下: public static void main(String[] args) { ...

随机推荐

  1. Java编程技巧之单元测试用例编写流程

    简介: 立足于"如何来编写单元测试用例",让大家"有章可循",快速编写出单元测试用例. 作者 | 常意来源 | 阿里技术公众号 温馨提示:本文较长,同学们可收藏 ...

  2. 浅谈RSocket与响应式编程

    ​简介: RSocket是高效一个二进制的网络通讯协议,能够满足很多场景下使用.另外,RSocket也是一个激进的响应式捍卫者,激进到连API都跟响应式无缝集成.本文我们将和大家分享RSocket与响 ...

  3. [FAQ] FinalCutPro 事件如何支持多个时间线

    左侧是建立的事件,右侧是默认的项目(也就是时间线上的剪辑项目). 如果需要这个事件里再弄一个时间线(比如剪辑另一个版本),左侧的事件上右击新建项目: 另一个项目,在这上面可以继续时间线的创作,等于是选 ...

  4. WPF 通过 GifBitmapDecoder 调用 WIC 解析 Gif 和进行动画播放的简单方法

    本文告诉大家如何在 WPF 里,通过 GifBitmapDecoder 调用 WIC 层来解析 GIF 图片,然后采用动画的方式进行播放 在上一篇博客告诉大家,可以通过 GifBitmapDecode ...

  5. 13.prometheus监控tengine(无用)

    一.环境准备 1.1 docker安装tengine带nginx-module-vts模块(二选一) mkdir /data/ -p cd /data/ # 通过git clone下载已经创建好的do ...

  6. 实验8 #第8章 Verilog有限状态机设计-3 #Verilog #Quartus #modelsim

    3. 状态机A/D采样控制电路 3.1 目标:用状态机控制ADC0809实现数据采集. 3.2 ADC0809简介 (1)ADC0809是8位A/D转换器,片内有8路模拟开关,可控制8个 模拟量中 的 ...

  7. 让.NET 8 支持 Windows Vista RTM

    众所周知,从 Windows 的每次更新又会新增大量 API,这使得兼容不同版本的 Windows 需要花费很大精力.导致现在大量开源项目已经不再兼容一些早期的 Windows 版本,比如 .NET ...

  8. 【爬虫案例】用Python爬取百度热搜榜数据!

    目录 一.爬取目标 二.编写爬虫代码 三.同步视频讲解 四.完整源码 一.爬取目标 您好,我是@马哥python说,一名10年程序猿. 本次爬取的目标是:百度热搜榜 分别爬取每条热搜的: 热搜标题.热 ...

  9. TCP协议分析工具TcpEngine V1.2.0使用教程

    概述 目前主流的网络数据分析工具主要有两类,一类是http协议分析工具,如fiddler,这类工具擅长对字符串类型协议分析:另一类是原始网络数据包的监听分析,如Wireshark,这类工具擅长分析网络 ...

  10. 谈谈 JVM 垃圾回收机制

    前言 垃圾回收需要思考三件事情,哪些内存需要回收?什么时候回收?如何回收? 一.哪些内存需要回收 JVM 的内存区域中,程序计数器.虚拟机栈和本地方法栈的生命周期是随线程而生,随线程而灭的.这几个区域 ...