多线程环境下,或者web环境下,可以使用ThreadLocal做变量池用


import java.util.HashMap;
import java.util.Map;public abstract class AbstractThreadContext {public AbstractThreadContext() {}abstract ThreadLocal<Map<String, Object>> getThreadContext();public void set(final String key, final Object value) {ThreadLocal<Map<String, Object>> threadContext = this.getThreadContext();Map<String, Object> map = (Map)threadContext.get();if (map == null) {map = new HashMap();}((Map)map).put(key, value);threadContext.set(map);}public void removeKey(String key) {ThreadLocal<Map<String, Object>> threadContext = this.getThreadContext();Map<String, Object> map = (Map)threadContext.get();if (map == null) {map = new HashMap();}((Map)map).remove(key);threadContext.set(map);}public Object get(String key) {ThreadLocal<Map<String, Object>> threadContext = this.getThreadContext();Map<String, Object> map = (Map)threadContext.get();return map == null ? null : map.get(key);}public void clean() {ThreadLocal<Map<String, Object>> threadContext = this.getThreadContext();Map<String, Object> map = (Map)threadContext.get();if (map != null) {map.clear();threadContext.set(map);}}
}

import java.util.Map;public final class ThreadContextStoreUtil extends AbstractThreadContext {private static ThreadLocal<Map<String, Object>> threadContext = new ThreadLocal();private static volatile ThreadContextStoreUtil app = null;private ThreadContextStoreUtil() {}public static synchronized ThreadContextStoreUtil getInstance() {if (app == null) {Class var0 = ThreadContextStoreUtil.class;synchronized(ThreadContextStoreUtil.class) {if (app == null) {app = new ThreadContextStoreUtil();}}}return app;}@Overrideprotected ThreadLocal<Map<String, Object>> getThreadContext() {return threadContext;}
}

public class ThreadMain {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {ThreadContextStoreUtil.getInstance().set("1", "1");ThreadContextStoreUtil.getInstance().set("2", "11");ThreadContextStoreUtil.getInstance().set("3", "111");System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("1"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("2"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("3"));}}, "a").start();new Thread(new Runnable() {@Overridepublic void run() {ThreadContextStoreUtil.getInstance().set("1", "2");ThreadContextStoreUtil.getInstance().set("2", "22");ThreadContextStoreUtil.getInstance().set("3", "222");System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("1"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("2"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("3"));}}, "b").start();new Thread(new Runnable() {@Overridepublic void run() {ThreadContextStoreUtil.getInstance().set("1", "3");ThreadContextStoreUtil.getInstance().set("2", "33");ThreadContextStoreUtil.getInstance().set("3", "333");System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("1"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("2"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("3"));}}, "c").start();new Thread(new Runnable() {@Overridepublic void run() {ThreadContextStoreUtil.getInstance().set("1", "4");ThreadContextStoreUtil.getInstance().set("2", "44");ThreadContextStoreUtil.getInstance().set("3", "444");System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("1"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("2"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("3"));}}, "d").start();}
}

ThreadLocal应用-使用ThreadLocal做线程缓存变量池相关推荐

  1. 详解线程本地变量ThreadLocal

    并发应用的一个关键地方就是共享数据.如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性.这意味着,如果你在一个线程里改变 ...

  2. java 线程变量put_Java线程(篇外篇):线程本地变量ThreadLocal

    首先说明ThreadLocal存放的值是线程内共享的,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递,这样处理后,能够优雅的解决一些实际问题,比如hibernate中的OpenSessi ...

  3. JAVA线程本地变量ThreadLocal和私有变量的区别

    ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些. 所以,在Java中编写线程局部变量的代码相对来说要笨 ...

  4. 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )

    文章目录 一.Message 消息 二.ThreadLocal 线程本地变量 三.Looper 中的消息队列 MessageQueue 一.Message 消息 模仿 Android 中的 Messa ...

  5. ThreadLocal实战之数据库执行器线程同步

    前言 近来,在框架中获取数据库执行器时,一直通过参数传递,颇觉繁琐,且不符合设计常理. 故而,思虑片刻,欲将其融入至笔者框架内置的"RequestAttributes"对象中. 此 ...

  6. 通过transmittable-thread-local源码理解线程池线程本地变量传递的原理

    前提 最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文.想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能 ...

  7. java threadlocal用法_Java ThreadLocal的用法解析

    简介 java中经常使用ThreadLocal作为处理高并发访问的可选手段,ThreadLocal并不是一个线程,而是"以线程为作用域"的一种面向对象的数据结构.其用法的也有着让人 ...

  8. mysql 线程缓存_浅析MySQL内存的使用说明(全局缓存+线程缓存)

    首先我们来看一个公式,MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的 部分): 复制代码 代码如下: per_thread_buffers=(read_buffer_s ...

  9. Java线程:线程私有变量

    Java线程:线程私有变量 线程对象也是从一个(线程)类而构建的,线程类作为一个类也可以拥有自己的私有成员.这个成员为此线程对象私有,有时候使用线程私有变量,会巧妙避免一些并发安全的问题,提高程序的灵 ...

最新文章

  1. Nature子刊:华中农大Kenichi Tsuda组利用植物体内原位细菌转录及蛋白组学鉴定寄主免疫攻击的病原菌蛋白...
  2. 五千万美元注资孵化器,ETC能实现绝地反击吗?
  3. python xlwt xlrd_用xlrd和xlwt操作Excel文档
  4. oc之Mac-响应链(Responder Chain)
  5. JEECG 3.7.1 非Maven版本源码下载,企业级JAVA快速开发平台
  6. 如何用Java打出a加b_Java 实现 输入 AA 输出 AB ..输入 AZ 输出 BA 一直到输出 ZZ
  7. java数据存在ie中_[Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js
  8. 基于Java毕业设计新能源汽车租赁管理系统源码+系统+mysql+lw文档+部署软件
  9. BeX5安装遇到问题
  10. 安卓和IOS测试区别和注意点
  11. JAVA一键获取文件名并对比Excel名单,看看谁没有交作业
  12. iOS开发技巧--xcode中的group与folder
  13. ICPC2017沈阳赛区游记
  14. POI实现Excel模板下载
  15. 智慧社区综合管理平台——小组展示1
  16. 计算机网络多项式的定义,使用多项式方法定义一个圆
  17. stm32PWM精确控制脉冲个数
  18. Prim之 公路村村通
  19. 能够免费做商业站点的CMS讨论
  20. CC2530接入OneNET-实现数据上传和命令下发

热门文章

  1. php 系统日志,PHP中把错误日志保存在系统日志中(Windows系统)
  2. python 发邮件 timeout_python发送邮件
  3. c语言 线程a每隔10秒执行一次,线程b每隔100秒执行一次,线程池执行时多线程每隔100ms执行一次线程任务 求解答...
  4. r语言各形状编号_R语言入门第八讲:编码分类变量(factor)
  5. lbp特征提取算法 知乎_计算机视觉基础-图像处理: LBP特征描述算子
  6. app 名字 android,SiRi App For Android名字特殊符号_九游手机游戏
  7. 蓝宝石 470 原版 bios_想怎么玩就怎么玩!改造双BIOS显卡,不再为噪音和性能选择而烦恼...
  8. html一个层下面两个小层并奇,我是一个奇数是一个两位数,十位数字与个位数字的积是2,猜猜看我是几?——青夏教育精英家教网——...
  9. 树莓派python教程_两个简易的树莓派初学者Python程序
  10. 最大似然函数对数求解的便利