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启动处理业务的线程并非一一对应的,而是通过一个线程池进行调度。
错误的使用案例:
@Controller
public class ThreadLocalController {
private static final ThreadLocal<Integer> id = new ThreadLocal<Integer>();
@ResponseBody
@RequestMapping("/threadLocalTest")
public Map<String, Object> threadLocalTest() {
Integer myId = id.get();
if (myId == null) {
id.set(1);
} else {
id.set(id.get() + 1);
}
System.out.println(id.get());
Map<String, Object> retMap = new LinkedHashMap<String, Object>();
retMap.put("id", id.get());
return retMap;
}
}
以上代码运行的时候会发现,命令行打印的id 是不确定的,这时因为tomcat本身对请求做线程池缓存业务处理线程导致的。
正确的使用案例:
@Controller
public class ThreadLocalController {
private static final ThreadLocal<Integer> id = new ThreadLocal<Integer>();
@ResponseBody
@RequestMapping("/threadLocalTest")
public Map<String, Object> threadLocalTest() {
Integer myId = id.get();
if (myId == null) {
id.set(1);
} else {
id.set(id.get() + 1);
}
System.out.println(id.get());
Map<String, Object> retMap = new LinkedHashMap<String, Object>();
retMap.put("id", id.get());
id.remove();
return retMap;
}
}
以上代码每次输出的都是1,注意id.remove() 方法的调用,在每次请求结束的时候remove对象。
更多的情况下,做为系统级别的,可以在filter下做ThreadLocal对象set 和 remove 操作!
分享到:
相关推荐
javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转...所以,使用ThreadLocal可以解决这样的分层问题。
ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案.docx
ThreadLocal
NULL 博文链接:https://xuranpaoche.iteye.com/blog/1514071
Java中ThreadLocal的设计与使用.doc
NULL 博文链接:https://bijian1013.iteye.com/blog/2380233
ThreadLocal源码分析和使用
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。
ThreadLocal的几种误区ThreadLocal的几种误区ThreadLocal的几种误区
NULL 博文链接:https://justsee.iteye.com/blog/791919
运行在tomcat容器中的ThreadLocal容易产生的问题ThreadLocal在tomcat容器中的的生命周期并不等于web request的生命周期,所以(以下讨论的是tomcat容器中使用ThreadLocal),所以ThreadLocal不应保存与请求会影响的...
ThreadLocal原理及在多层架构中的应用
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
在我们日常 Web 开发中难免遇到需要把一个参数层层的传递到最内层,然后中间层根本不需要使用这个参数,或者是仅仅在特定的工具类中使用,这样我们完全没有必要在每一个方法里面都传递这样一个 通用的参数。...
DbUTils中用ThreadLocal类
正确理解ThreadLocal.pdf