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();
}
分享到:
相关推荐
弱引用意味着,如果键不再被其他地方引用,即使值还在,垃圾收集器也会回收键,从而自动清理`ThreadLocalMap`中不再使用的条目。 4. **生命周期**: `ThreadLocal`变量的生命周期与创建它的线程相关联。当线程结束时...
尽管ThreadLocal在很多场景下都非常有用,但它也有一些潜在的问题需要注意,比如内存泄漏和过度使用可能导致系统资源浪费。因此,理解ThreadLocal的工作原理并谨慎使用是非常重要的。 在提供的"ThreadLocal示例...
这样,当ThreadLocal对象不再被其他地方引用时,即使其在Map中,也会被垃圾收集器回收,降低了内存泄漏的风险。同时,弱引用的使用也使得Map能够更早地释放不再使用的Entry,提高内存利用率。 **ThreadLocal的生命...
下面将详细介绍ThreadLocal的工作原理、使用方法以及在Android中的实际应用。 ### 1. ThreadLocal工作原理 ThreadLocal内部实现了一个HashMap,用于存储每个线程与对应的变量副本之间的映射关系。当我们创建一个新...
1. **创建ThreadLocal实例**:首先,你需要创建一个ThreadLocal实例,这是你将要存储线程局部变量的地方。例如: ```java ThreadLocal<String> threadLocalVar = new ThreadLocal(); ``` 2. **设置线程局部值**...
- ThreadLocal 不是存储变量的地方,而是为每个线程提供一个单独的变量副本。每个线程都拥有一个与之关联的 ThreadLocalMap,这个 map 将 ThreadLocal 对象作为键,线程本地副本作为值。 - 当创建一个新的 ...
1. **线程安全**:`RestTemplate`不是线程安全的,如果你的应用有高并发需求,建议为每个请求创建新的实例或者使用`ThreadLocal`进行管理。 2. **异常处理**:默认情况下,`RestTemplate`将所有HTTP错误代码视为...
需要注意的是,使用`ThreadLocal`时一定要记得在合适的地方清除数据,以免造成内存泄漏。此外,这种方法只适用于单线程环境,在多线程环境中可能需要采用其他方式来传递`HttpServletRequest`对象。
- 使用`ThreadLocal`时要注意及时清理不再使用的资源,避免内存泄漏。 #### 6. 线程安全的数据结构 - **并发容器类**:Java提供了一系列线程安全的容器类,如`ConcurrentHashMap`、`ConcurrentLinkedQueue`和`...
在需要切换数据源的地方,调用`setDataSource`方法,如`DataSourceContextHolder.setDataSource("dataSource2")`,在操作完成后记得调用`clearDataSource`恢复原状。 **使用多数据源** 在Service层或DAO层,使用`@...
3. **异常处理**:避免使用空try-catch块,合理设计异常层级,注意捕获具体异常类型而非Exception,避免在finally块中修改程序状态。 4. **集合初始化**:使用集合时,推荐使用集合工厂方法,如`List<String> list ...
StopWatch在同一个线程中使用ThreadLocal存储,确保线程安全,避免资源竞争。 2. **减小事务边界**: 事务范围应尽可能小,仅包括必要的写操作。过度扩展事务边界会增加锁的持有时间,消耗更多的数据库资源。可以...
2.避免使用ThreadLocal:尽量少用ThreadLocal,或者使用WeakReference来避免强引用。 3.正确使用ClassLoader:确保ClassLoader被正确释放,以免加载的类无法被卸载。 Java内存泄露是Java应用程序中一个常见的问题,...
应在Action的execute方法或其他适当的地方使用ActionContext。 总之,ActionContext是Struts2中连接Action与请求、会话、Servlet API的重要桥梁,它简化了在Action中操作这些对象的过程,同时保证了线程安全性。而...
- `DBContextHolder.java`: 使用ThreadLocal存储当前线程的数据库连接信息。 - `DBConfig.properties`: 存储主数据库和从数据库的连接信息。 - `Service层`:带有`@ReadOperation`和`@WriteOperation`注解的业务方法...
在需要切换数据源的地方,我们可以使用AOP的`@Before`、`@After`等注解来设置和清除当前数据源: ```java @Aspect @Component public class DataSourceAspect { @Before("@annotation...
通过自定义`CurrentDataSourceHolder`类或使用`ThreadLocal`来保存当前线程的数据源信息。在需要切换数据源的地方,更新这个信息,`AbstractRoutingDataSource`会自动识别并选择正确数据源。 6. **代码示例**: ...
2. **线程安全性**:`Random`类不是线程安全的,如果在多线程环境中使用,每个线程应拥有自己的`Random`实例,或者使用`ThreadLocal<T>`来封装`Random`实例,以避免并发访问导致的非预期结果。 3. **性能考虑**:...
- 生成器允许函数在执行过程中保存状态,下次调用时从上次停止的地方继续执行。 #### 7. 函数式编程 - **高阶函数**: - 如map/reduce、filter、sorted等,这些函数可以接受函数作为参数。 - **返回函数**: - ...