ThreadLocal本地局部线程demo
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的更多相关文章
- Java 类 ThreadLocal 本地线程变量
前言:工作中将要使用ThreadLocal,先学习总结一波.有不对的地方欢迎评论指出. 定义 ThreadLocal并不是一个Thread,而是Thread的局部变量.这些变量不同于它们的普通对应物, ...
- ThreadLocal本地线程变量的理解
一般的Web应用划分为展现层.服务层和持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用.在一般情况下,从接收请求到返回响应所经过的所有程序调用都同属于一个线程. ...
- ThreadLocal = 本地线程?
一.定义 ThreadLocal是JDK包提供的,从名字来看,ThreadLocal意思就是本地线程的意思. 1.1 是什么? 要想知道他是个啥,我们看看ThreadLocal的源码(基于JDK 1. ...
- Java Concurrency - ThreadLocal, 本地线程变量
共享数据是多线程应用最常见的问题之一,但有时我们需要为每个线程保存一份独立的变量.Java API 提供了 ThreadLocal 来解决这个问题. 一个 ThreadLocal 作用的例子: imp ...
- 线程系列5--java中的ThreadLocal类实现线程范围内的数据共享(二)
ThreadLocal类可以理解成一个类似与map集合使用,以当前线程当做key 来使用,将线程氛围内需要共享的数据当做value,形成键值对的形式使用.ThreadLocal和线程同步机制都是为了解 ...
- ThreadLocal 解决simpledateformat线程不安全
SimpleDateFormat在多线程情况下会出现线程不安全的情况,故用ThreadLoacl 处理/** * 用ThreadLocal处理simplDateFormat线程不安全 */public ...
- Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离.
- JDBCToolsV2:利用ThreadLocal保证当前线程操作同一个数据库连接对象。
JDBCToolsV2: 利用ThreadLocal保证当前线程操作同一个数据库连接对象. package com.dgd.test; import com.alibaba.druid.poo ...
- Flask中的ThreadLocal本地线程,上下文管理
先说一下和flask没有关系的: 我们都知道线程是由进程创建出来的,CPU实际执行的也是线程,那么线程其实是没有自己独有的内存空间的,所有的线程共享进程的资源和空间,共享就会有冲突,对于多线程对同一块 ...
- ThreadLocal解析:父线程的本地变量不能传递到子线程详解
众所周知,ThreadLocal类是java提供线程本地变量的工具类.但父线程的本地变量却不能被子线程使用,代码如下: public static void main(String[] args) { ...
随机推荐
- vue+vant实现省市联动(van-area)组件(包含比较全面的全国省市数组数据)
组件库太香了,人家nb,自己写的都是** 效果: 1.安装vant库以及main.js的配置 2.一般结合van-popup组件 </template> <van-popup v-m ...
- 异构数据源同步之表结构同步 → 通过 jdbc 实现,没那么简单
开心一刻 今天坐沙发上看电视,旁边的老婆拿着手机贴了过来 老婆:老公,这次出门旅游,机票我准备买了哈 我:嗯 老婆:你.我.你爸妈.我爸妈,一共六张票 老婆:这上面还有意外保险,要不要买? 我:都特么 ...
- linux下的开机启动
使用systemctl命令,systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 据说在CentOS7.0后,不再使用service, ...
- three.js教程1补充-gui.js库使用
gui.js是一个前端js库,对HTML.CSS和JavaScript进行了封装,学习开发的时候,借助dat.gui.js可以快速创建可手动控制三维场景的UI交互界面,打开API文档中案例体验一下就能 ...
- 前后端分离项目集成PageOffice——实现在线编辑Word文件的版本控制
PageOffice本身提供了SaveFilePage的js方法,但是由于该方法不支持代理且不能跨域导致在前后端分离项目中无法使用 功能:实现三个按钮分别保存不同版本的文件 1.PageOffice可 ...
- zabbix使用
安装部署6.0版本 获取仓库 https://www.zabbix.com/cn/download?zabbix=6.0&os_distribution=centos&os_versi ...
- git使用其它
创建目录 切换到本地新建的dev分支,目录下还是这个目录下的文件.我push一下,指定推送到dev分支,那么dev分支就在远程仓库同步创建,并且文件也是本地这个目录下的文件,一样的. 好像得改个名字才 ...
- .NET中特性+反射 实现数据校验
.NET中特性+反射 实现数据校验 在.NET中,我们可以使用特性+反射来实现数据校验.特性是一种用于为程序中的代码添加元数据的机制.元数据是与程序中的代码相关联的数据,但不直接成为代码的一部分.通过 ...
- 多进程池Flask实战应用
多进程池Flask实战应用 import json import math import flask from concurrent.futures import ProcessPoolExecuto ...
- starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
在线求解[已解决] 问题 D:\persioninto_exe\soft\jdk1.8.0_322\bin\java.exe -XX:TieredStopAtLevel=1 -noverify -Ds ...