ThreadLocal 相关分析,请查看http://wangxinchun.iteye.com/blog/1884228 
另外一个必须要提的点是: 
ThreadLocal在线程池环境下的使用。 
比如tomcat 提供的web http请求,一般都有线程池对请求做处理。

这种情况下要注意,并非每次web请求时候程序运行的ThreadLocal都是唯一的,ThreadLocal的生命周期不等于一次Request的生命周期,ThreadLocal与线程对象紧密绑定的,由于Tomcat使用了线程池,线程是可能存在复用情况,这时的ThreadLocal 的使用要谨慎使用。

web请求下 的ThreadLocal  使用要保证:请求进来的时候set,请求回去的时候remove。只有这样才能保证请求内的ThreadLocal  是唯一的。 这个特性在深刻的提醒我们:一次http请求和tomcat启动处理业务的线程并非一一对应的,而是通过一个线程池进行调度。 
错误的使用案例:

Java代码  
  1. @Controller
  2. public class ThreadLocalController {
  3. private static final ThreadLocal<Integer> id = new ThreadLocal<Integer>();
  4. @ResponseBody
  5. @RequestMapping("/threadLocalTest")
  6. public Map<String, Object> threadLocalTest() {
  7. Integer myId = id.get();
  8. if (myId == null) {
  9. id.set(1);
  10. } else {
  11. id.set(id.get() + 1);
  12. }
  13. System.out.println(id.get());
  14. Map<String, Object> retMap = new LinkedHashMap<String, Object>();
  15. retMap.put("id", id.get());
  16. return retMap;
  17. }
  18. }

以上代码运行的时候会发现,命令行打印的id 是不确定的,这时因为tomcat本身对请求做线程池缓存业务处理线程导致的。

正确的使用案例:

Java代码  
  1. @Controller
  2. public class ThreadLocalController {
  3. private static final ThreadLocal<Integer> id = new ThreadLocal<Integer>();
  4. @ResponseBody
  5. @RequestMapping("/threadLocalTest")
  6. public Map<String, Object> threadLocalTest() {
  7. Integer myId = id.get();
  8. if (myId == null) {
  9. id.set(1);
  10. } else {
  11. id.set(id.get() + 1);
  12. }
  13. System.out.println(id.get());
  14. Map<String, Object> retMap = new LinkedHashMap<String, Object>();
  15. retMap.put("id", id.get());
  16. id.remove();
  17. return retMap;
  18. }
  19. }

以上代码每次输出的都是1,注意id.remove() 方法的调用,在每次请求结束的时候remove对象。

更多的情况下,做为系统级别的,可以在filter下做ThreadLocal对象set 和 remove 操作!

转载于:https://www.cnblogs.com/qiumingcheng/p/4894564.html

ThreadLocal 在web环境下使用的边界问题相关推荐

  1. 基于Java技术的Web环境下分布式数据库互操作性的实现

                作者:李炽明 莫倩 徐明 1 JDBC工作原理 JDBC(Java Database Connectivity)是1个Sun公司注册了的商标,代表用来执行SQL语句的Java语 ...

  2. 关于JS调用Adobe Reader ActiveX插件,在web环境下调用本地打印机执行静默打印的实现

    因为之前被实施商的前端童鞋理直气壮的卡了脖子告诉我写不出来,让我很不爽,所以还是搜集了一些资料最终测试成功了.注意一下这个只能在IE10及以上的IE内核环境下可用(我只测试了这个环境,但是IE是没跑了 ...

  3. Web环境下使用Starling出现的问题收集整理

    FlashBuilder环境下使用Starling出现的问题收集整理 刚开始学习Starling框架,遇到了不少问题,苦于无解,向Starling中文交流群求助.问题得到一 一解决.在这里非常感谢他们 ...

  4. WEB环境下打印报表的CRYSTAL的解决方案

    <%@ LANGUAGE="VBSCRIPT" %> <% ' = = = = = = = = = = = = = = = = = = = = = = = = = ...

  5. linux https重定向,Linux | Apache环境下强制http跳转至https的配置总结

    如果网站安装SSL证书开启HTTPS后,不设置强制跳转的话,http和https会同时存在,那么如何在Apache Web环境下将HTTP强制跳转到HTTPS呢? 接下来将给给出使用.htaccess ...

  6. .NET环境下创建Activex (转)

    虽然不倡导在Web环境下使用Activex控件,但有时会遇到与底层通信的问题,这时利用Activex可以比较好的解决,工商银行的U盾就是如此.Activex还有一个好处就是可以把winform下封装的 ...

  7. java socket tomcat_在Tomcat环境下使用socket通信

    最近在做一个APP的服务器端,但是APP和服务器端使用的是HTTP的通信协议,而另一方与服务器端通信却使用的是自定义的通信协议.具体的系统拓扑如下: 为了完成以上的需求,一般的解决方案有两种: 自己实 ...

  8. 1.1、推断和设置“是否为 Web 环境”

    功能位置 // **************** org.springframework.boot.SpringApplication ******************/ private bool ...

  9. PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)...

    源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...

最新文章

  1. 手机php文件怎么改后辍,php修改文件后缀名的方法
  2. 用户隐私泄露事件频发,我们的信息很难维护吗?
  3. 一个初学者的SAP Cloud Platform学习笔记
  4. JAVA笔记(十四)
  5. TQ210——S5PV210启动过程
  6. Django contenttypes 应用
  7. 5个月内要完成的东西
  8. vmWare中安装centos7
  9. upc组队赛5 Election of Evil【搜索】
  10. C#使用NPOI导出excel设置单元格背景颜色
  11. win10内存占用率高达95%解决方法
  12. 优美诗词(持续更新)
  13. centos 内网ip 设置_CentOS7 设置局域网固定IP
  14. MATLAB遗传算法解决旅行商(TSP)问题
  15. linux中tac命令详解,一天一个shell命令 linux文本操作系列-tac,rev命令详解
  16. ZZNU 正约数之和
  17. 西北农林科技大学考研计算机大纲,2021年西北农林科技大学考研真题大纲参考书目...
  18. 从sql注入到getshell (内附sqlmap的os-shell遇到中文路径的解决办法)
  19. 华为服务器如何设置网站dns,华为ensp服务器dns配置
  20. java 鱼眼照片的矫正_使用OpenCV校准鱼眼镜头

热门文章

  1. java的学习步骤方法书籍大总结
  2. 【摘转留用】35前要考虑的
  3. Web开发工具大集合
  4. JS进阶 你真的掌握变量和类型了吗?
  5. DelayQueue实现Java延时任务
  6. 设计原则之单一职责原则
  7. 用插件的形式编写升级版 jquery_select_interval.js 源码
  8. 将语音搜索集成到Google Now中
  9. BZOJ 1878: [SDOI2009]HH的项链( BIT )
  10. asp.net 去除字符串右侧的最后一个字符