`
dragonhunter
  • 浏览: 33307 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

在web项目中不能使用ThreadLocal作为全局变量

    博客分类:
  • java
阅读更多

由于项目需求变动,需要在接口里添加一个参数

比如原来method(String param1) 现在要变成method(String param1,String param2)

一般做法就是把原来的接口的方法全换掉,或者重载再写一个多一个参数的方法。

 

参数由controller 一直到service,由于改动比较多,就想到用ThreadLocal。

后来发现有一个没有参数的请求,也做了处理参数的操作,但是又不是每次都出现,

多请求几次就会出现一两次,感觉很奇怪:

url1:http://127.0.0.1/controller1?param=1

url2:http://127.0.0.1/controller2

 



 

 

controller1把request的参数放到threadLocal里,调用service,可以拿到param的值。

可是controller2有时也可以拿到param的值。

一点点排除发现不管是tomcat还是resin容器,都是线程池管理的,

比如controller1请求使用的thread1线程,在thread1放param的值,当请求完了后,thread1并没有销毁,

多次请求contoller2,controller2的线程可能会是thread1,这时还是有param的值的。所以也出现没有参数

的请求也在service处理了param。

找到问题后就修复:

有的人会建议在controller2中也加一个threadLocal.set(param)   [param的值为null]不就行了。这个方法本人感觉不好,可以使用spring的@Scope(value="request"),这个注解是对每一次request请求时

的参数做一个全局参数。

 

 

  • 大小: 9.5 KB
分享到:
评论

相关推荐

    使用ThreadLocal管理“session”数据

    在传统的多线程Web应用中,由于多个线程可能会处理同一个请求,如果直接在全局变量中存储session信息,可能会导致线程安全问题。而ThreadLocal提供了一个线程局部的存储空间,每个线程都有自己的ThreadLocal变量...

    ThreadLocal原理及在多层架构中的应用

    - 尽量避免将ThreadLocal用作长期持有的全局变量,尤其是在静态方法或静态变量中使用。 - 避免过度依赖ThreadLocal,因为它可能导致设计上的复杂性和难以维护的问题。 综上所述,ThreadLocal是Java多线程编程中的一...

    ThreadLocal的用处

    - 请求上下文:在Web应用中,可以使用ThreadLocal存储HttpServletRequest、Session等与请求相关的数据,确保这些数据只在当前请求的线程内可见。 - 数据库连接:在数据库连接池中,可以使用ThreadLocal为每个线程...

    Java源码解析ThreadLocal及使用场景

    在这个场景中,不能使用ThreadLocal类,因为ThreadLocal适用的场景是,多个线程都需要使用一个变量,但这个变量的值不需要在各个线程间共享,各个线程都只使用自己的这个变量的值。 ThreadLocal还能解决一个参数...

    通向架构师的道路(第七天)之漫谈使用ThreadLocal改进你的层次的划分

    此外,ThreadLocal还有其他应用场景,比如在Web开发中,可以用来存储请求相关的上下文信息,如用户会话、线程安全的计数器等,避免在多线程环境中的数据污染问题。 总之,ThreadLocal是Java多线程编程中的一种有效...

    Python之ThreadLocal共4页.pdf.zip

    3. **避免全局变量**:在多线程环境中,全局变量可能导致数据竞争和同步问题,ThreadLocal可以作为局部化的全局变量,为每个线程提供独立的副本。 使用ThreadLocal的基本操作包括: - **创建ThreadLocal对象**:`...

    Java多线程编程之ThreadLocal线程范围内的共享变量

    这与传统的全局变量不同,全局变量在所有线程间共享,可能导致数据冲突。 **ThreadLocal的作用和目的:** 1. **数据隔离**:ThreadLocal确保了每个线程都有自己的变量副本,避免了多线程之间的数据竞争,从而提高...

    Web服务器的工作原理

    在Web应用中,Cookie经常与Session一起使用,通过在客户端存储Session标识符来简化会话管理。 ### 确保线程安全 #### 七、线程安全 在Servlet环境中,确保线程安全是非常重要的,因为多个请求可能会并发访问相同的...

    java8-threadlocal

    - 为了防止这种情况,应该在不使用 ThreadLocal 时显式调用 `remove()`,或者在适当的时机(如应用关闭时)进行全局清理。 5. **线程池中的注意事项**: - 如果使用线程池,线程可能会复用。当一个线程完成任务后...

    javaWeb实现事务1

    ThreadLocal是Java中的一个类,用于在每个线程中存储独立的变量副本。在这里,`ConnectionContext`类使用ThreadLocal来为每个线程维护一个数据库连接。这样,每个线程在执行过程中都可以访问自己独有的连接,避免了...

    servlet与Struts action线程安全问题分析

    5. **解决策略**:实现线程安全的方法包括但不限于使用线程局部变量(ThreadLocal)、synchronized关键字、ReentrantLock等同步机制,以及避免在Servlet或Action中使用实例变量,转而使用局部变量或依赖注入等策略。...

    基于全局储存的新思路 _ Tomcat的一种通用回显方法研究1

    进一步跟踪调用链,发现在AbstractProtocol的内部类ConnectionHandler中,处理器(Processor)的信息被存储在了一个全局变量global中,该变量包含了RequestGroupInfo类型的列表,每个RequestGroupInfo包含了Request...

    分页技术实现

    分页技术是Web应用中非常常见的一种数据展示方式,它能有效地管理大量数据,避免一次性加载所有数据导致的性能问题。以下将详细解释如何实现分页技术,主要涉及`Pager-taglib 2.0`标签库的使用、分页参数的传递以及...

    Python web全栈学习路线.docx

    * 局部变量和全局变量 * 字符串及其操作 * 函数高级关键字参数 * 函数的返回值 * 位置参数 * 可变参数 * lambda 表达式 * 递归函数 * 参数引用 * 常用内置函数 * 类和对象面向对象思想 * 接收啊、类的定义、对象的...

    JSP文档基础知识

    但要特别注意,避免在Servlet中使用全局变量存储数据,因为这可能导致数据竞争和不一致性。 3. **Java多态** 多态是面向对象编程的一个关键特性,它允许使用父类型的引用操作子类型对象。在Java中,多态有两种主要...

    1工作临时-servlet 多线程问题

    例如,如果多个线程同时访问和修改同一个全局变量,数据的完整性可能会受损。为了避免这种情况,可以使用同步机制,如`synchronized`关键字或Java并发工具类。 2. **线程局部存储**:Servlet容器可以使用线程局部...

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    在业务代码中,通过`@Transactional`注解开启分布式事务,并在必要时使用`ThreadLocal`存储当前业务的数据源标识。 8. **监控与调试** Druid提供了一个Web监控界面,可以实时查看数据源的使用情况、SQL执行效率等...

    Spring MVC面试宝典1.pdf

    在SpringMVC中,注解主要用于声明式的配置,使得开发人员可以在不使用XML配置的情况下实现控制器、请求映射等功能。 ##### 2.4 SpringMVC常用的注解有哪些及作用? - **@Controller**:标记一个类作为SpringMVC的...

    hibernate的事务核并发

    在多线程环境中,如Web应用或EJB容器,为了保证`Session`的线程安全和资源的有效利用,可以使用`ThreadLocal`变量来存储当前线程的`Session`实例。然而,在CMT环境中,由于单个session bean可能会被多个线程并行调用...

Global site tag (gtag.js) - Google Analytics