`
kensunhu
  • 浏览: 16906 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ThreadLocal使用注意的地方

    博客分类:
  • J2SE
阅读更多

   ThreadLocal解决了多线程并发操作单例对象属性带来的冲突问题.当采用ThreadLocal来保存对象变量时,变量就归各自的线程所有.因为调用set方法时,map中的key就为这个线程名.

   在这我想说的一点是,当调用get方法从ThreadLocal中取回变量时,不要忘了remove掉.为什么一定要remove一下呢?

呵呵.主要有两个原因:

   (1)利于GC快速回收变量内存.app server都是用线程池处理并发请求,不remove掉长久得不到GC.

   (2)产生脏数据.这点很危险.例如,A用户请求的数据,怎么后来的B用户请求时也有A所产生的数据了呢?
产生这个问题的原因还是app server用线程池处理并发,对线程的复用造成.

   代码:

    public void setVar(){
           Map<String, Object> model = (Map<String, Object>)modelThreadLocal.get();
           if(model==null){
               model = new LinkedHashMap<String, Object>();
           }
           modelThreadLocal.set(model);
    }
    public void getVar(){
    	Map<String, Object> model = (Map<String, Object>)modelThreadLocal.get();
    	modelThreadLocal.remove();
    }

 

分享到:
评论

相关推荐

    ThreadLocal简单Demo

    弱引用意味着,如果键不再被其他地方引用,即使值还在,垃圾收集器也会回收键,从而自动清理`ThreadLocalMap`中不再使用的条目。 4. **生命周期**: `ThreadLocal`变量的生命周期与创建它的线程相关联。当线程结束时...

    java 简单的ThreadLocal示例

    尽管ThreadLocal在很多场景下都非常有用,但它也有一些潜在的问题需要注意,比如内存泄漏和过度使用可能导致系统资源浪费。因此,理解ThreadLocal的工作原理并谨慎使用是非常重要的。 在提供的"ThreadLocal示例...

    ThreadLocal_ThreadLocal源码分析_

    这样,当ThreadLocal对象不再被其他地方引用时,即使其在Map中,也会被垃圾收集器回收,降低了内存泄漏的风险。同时,弱引用的使用也使得Map能够更早地释放不再使用的Entry,提高内存利用率。 **ThreadLocal的生命...

    Android 中 ThreadLocal使用示例

    下面将详细介绍ThreadLocal的工作原理、使用方法以及在Android中的实际应用。 ### 1. ThreadLocal工作原理 ThreadLocal内部实现了一个HashMap,用于存储每个线程与对应的变量副本之间的映射关系。当我们创建一个新...

    简单分析Java线程编程中ThreadLocal类的使用共

    1. **创建ThreadLocal实例**:首先,你需要创建一个ThreadLocal实例,这是你将要存储线程局部变量的地方。例如: ```java ThreadLocal&lt;String&gt; threadLocalVar = new ThreadLocal(); ``` 2. **设置线程局部值**...

    java8-threadlocal

    - ThreadLocal 不是存储变量的地方,而是为每个线程提供一个单独的变量副本。每个线程都拥有一个与之关联的 ThreadLocalMap,这个 map 将 ThreadLocal 对象作为键,线程本地副本作为值。 - 当创建一个新的 ...

    RestTemplate的使用及需要注意的地方

    1. **线程安全**:`RestTemplate`不是线程安全的,如果你的应用有高并发需求,建议为每个请求创建新的实例或者使用`ThreadLocal`进行管理。 2. **异常处理**:默认情况下,`RestTemplate`将所有HTTP错误代码视为...

    普通java类 获取Request

    需要注意的是,使用`ThreadLocal`时一定要记得在合适的地方清除数据,以免造成内存泄漏。此外,这种方法只适用于单线程环境,在多线程环境中可能需要采用其他方式来传递`HttpServletRequest`对象。

    java 并发编程 多线程

    - 使用`ThreadLocal`时要注意及时清理不再使用的资源,避免内存泄漏。 #### 6. 线程安全的数据结构 - **并发容器类**:Java提供了一系列线程安全的容器类,如`ConcurrentHashMap`、`ConcurrentLinkedQueue`和`...

    spring多数据源 创建 切换使用

    在需要切换数据源的地方,调用`setDataSource`方法,如`DataSourceContextHolder.setDataSource("dataSource2")`,在操作完成后记得调用`clearDataSource`恢复原状。 **使用多数据源** 在Service层或DAO层,使用`@...

    阿里巴巴java开发手册灵魂17问.zip

    3. **异常处理**:避免使用空try-catch块,合理设计异常层级,注意捕获具体异常类型而非Exception,避免在finally块中修改程序状态。 4. **集合初始化**:使用集合时,推荐使用集合工厂方法,如`List&lt;String&gt; list ...

    优化思路.doc

    StopWatch在同一个线程中使用ThreadLocal存储,确保线程安全,避免资源竞争。 2. **减小事务边界**: 事务范围应尽可能小,仅包括必要的写操作。过度扩展事务边界会增加锁的持有时间,消耗更多的数据库资源。可以...

    详解Java内存泄露的示例代码

    2.避免使用ThreadLocal:尽量少用ThreadLocal,或者使用WeakReference来避免强引用。 3.正确使用ClassLoader:确保ClassLoader被正确释放,以免加载的类无法被卸载。 Java内存泄露是Java应用程序中一个常见的问题,...

    ActionContext在struts2.0中的详细应用

    应在Action的execute方法或其他适当的地方使用ActionContext。 总之,ActionContext是Struts2中连接Action与请求、会话、Servlet API的重要桥梁,它简化了在Action中操作这些对象的过程,同时保证了线程安全性。而...

    AOP动态实现MYSQL数据库读写分离

    - `DBContextHolder.java`: 使用ThreadLocal存储当前线程的数据库连接信息。 - `DBConfig.properties`: 存储主数据库和从数据库的连接信息。 - `Service层`:带有`@ReadOperation`和`@WriteOperation`注解的业务方法...

    springboot实现多数据源切换

    在需要切换数据源的地方,我们可以使用AOP的`@Before`、`@After`等注解来设置和清除当前数据源: ```java @Aspect @Component public class DataSourceAspect { @Before("@annotation...

    spring 动态多数据源配置代码

    通过自定义`CurrentDataSourceHolder`类或使用`ThreadLocal`来保存当前线程的数据源信息。在需要切换数据源的地方,更新这个信息,`AbstractRoutingDataSource`会自动识别并选择正确数据源。 6. **代码示例**: ...

    C#产生一个随机整数

    2. **线程安全性**:`Random`类不是线程安全的,如果在多线程环境中使用,每个线程应拥有自己的`Random`实例,或者使用`ThreadLocal&lt;T&gt;`来封装`Random`实例,以避免并发访问导致的非预期结果。 3. **性能考虑**:...

    Python2.7学习文档

    - 生成器允许函数在执行过程中保存状态,下次调用时从上次停止的地方继续执行。 #### 7. 函数式编程 - **高阶函数**: - 如map/reduce、filter、sorted等,这些函数可以接受函数作为参数。 - **返回函数**: - ...

Global site tag (gtag.js) - Google Analytics