当前位置: 首页 > 网络应用技术

线路局部概念和用法场景

时间:2023-03-07 16:48:28 网络应用技术

  根据其自身的知识深度,此处仅限于使用和学习的知识点的整合,需要促进原则的解释。

  本文来自项目开发,希望能帮助您,不了解线路的朋友可能会问,这是什么,可以使用什么,可以使用什么?当地的解释不好,我希望包括很多。

  这是什么:

  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拦截器的应用,建议再次看到它!