根据其自身的知识深度,此处仅限于使用和学习的知识点的整合,需要促进原则的解释。
本文来自项目开发,希望能帮助您,不了解线路的朋友可能会问,这是什么,可以使用什么,可以使用什么?当地的解释不好,我希望包括很多。
这是什么:
ThreadLocal是类,是一个本地线程,它提供了避免共享数据的线程安全方法(线程变量隔离)。
查看源代码以查看评论(翻译):
这些变量的局部变量与它们的普通相应变量不同,因为每个访问的每个线程(通过其get或set方法)都有其独立的独立初始化变量副本。与与线程关联的线程关联的类中的字段(例如,用户ID或事务ID)
这有什么用:
根据“ Java Core卷1”,有时可以避免共享变量并使用ThreadLocal辅助类为每个线程提供自己的示例;
也就是说,每个线程都有一个线程插座,该线程存储私有数据。
只要存在线程,您就可以将值存储在相应的螺纹锁定位置中。
创建局部变量,其初始值是通过调用给定提供商(供应商)来生成的;
使用相对较少的方法可以使用:
以下是列表的更多方法:
返回该线程本地变量的当前线程副本的值。如果变量不值得当前线程,则首先初始化了初始值方法的初始化返回的值:
将该线程的本地变量的当前线程副本设置为指定值;
值 - 此线程的本地当前线程副本中的值
删除此线程的本地变量的当前线程值(在此处删除一点,而不是暂时删除,请留在后面)
ThreadLocal使用的场景主要是:( Quote)
每个线程都需要自己的独立实例,此实例需要在多种方法中使用
这是个人用途的场景:
我为什么要使用它?我想直接在项目中获取当前用户的信息,并且此函数使用ThreadLocal;
首先创建一个threadlocal类:
它包含数据的添加和获取,因为我们需要的是用户信息,然后将用户类传递到通用类型中。
可用操作对象,下一步是使用:
在此项目中个人使用在登录器中的位置,当信息检查成功时,将当前的用户对象添加到线程列表中,
在控制器中使用时,直接调用ThreadLocal中的GET方法以获取当前用户的信息:
资源调用完成后,在拦截器中删除了线路局部资源:
完成后的功能:
最终完成完成后,执行控制器后执行该方法。由于执行控制器方法后执行该方法,因此此方法适合某些资源清理,记录日志信息和其他处理操作
这意味着什么:
该程序首先在拦截器类中执行PreHandle()方法。如果此方法的返回值为真,则该程序将继续在处理器中执行该方法,否则将不会执行;您可以使用threadLocal来获取用户信息)处理请求后,postthandle()方法将被执行。
然后,它将通过DispatcherServ将客户端返回客户端;在DispatcherServ处理请求之后,它将执行aftercompleting()方法(此处此请求中的threadLocal中的用户信息);
如果我们在使用此线程后不删除线程局部中的变量,那么它将导致内存泄漏的问题,那么该问题是如何发生的?
首先查看螺纹网的内部结构:
首先,堆栈中保留的对象是对象的引用。对象的存储必须首先清晰。堆栈中的格式也与我们绘制的上述格式一致。堆中的地图是包含键和值的ThreadLocal地图。其中,值是我们需要保存的变量数据,关键是threadlocal实例。
也就是说:每个线程都维护一个线程截图。键是线程变量的副本,作为带有弱参考的线程局部实例的副本。
还应注意,上述图片的连接具有固体和虚线。实际线代表着强有力的参考。虚线表示弱参考;
CALANE和强烈的参考,软引用,弱参考,虚拟用途:?
这里只有概念。如果您有兴趣,您可以理解环境。
然后,我们看到了图片,因为我们知道强烈的引用和弱引文,因为螺纹lote胶属于与螺纹相同的生命周期。当在某个阶段执行GC时,当前线程仍然存在,但是线程局部实例已回收,也就是说,键不会没有,
我们都知道地图中的值需要查找密钥。钥匙已经消失了,因此该值将永远保持在内存中,直到内存已满,导致OOM,因此我们需要在使用后手动将其删除,因此它可以保证它不会保证它不是由OOM问题。GC将发生;
哪些问题已解决了线路局部
SpringMVC ---拦截器
写作太薄了!Spring MVC拦截器的应用,建议再次看到它!