gpt4 book ai didi

java - ThreadLocal 用于管理 session 数据

转载 作者:行者123 更新时间:2023-11-30 08:08:29 25 4
gpt4 key购买 nike

我对在管理 session 中使用线程本地有疑问。这是..

在 Thread Local 中,创建线程本地对象的任何线程都可以访问该 session 对象,并且只有该线程才能修改 session 对象数据。可能有许多线程正在运行以完成单个用户请求。那么参与完成一个用户请求的所有其他线程呢?

他们不会获得修改 session 对象的权限,因为无论哪个线程创建 Thread 本地对象都会获得自己的 session 对象,因此运行以完成单个用户请求的其他线程可能不会将其数据更新到他们所访问的 session 对象实际上想要。

我的意思是如果thread-1和thread-2参与完成一个用户请求,但是thread-1来创建threadlocal对象,而thread-2作为请求的一部分执行其他代码,但是在thread-2完成之后,它无法更新 session 数据,因为只有 tharead-1 可以访问 session ,因为它创建了线程本地对象。

那么我们如何解决这个问题。

我们是否确保只有一个线程参与完成单个用户请求?或

我们如何确定创建 threadlocal 对象的线程只会更新与该请求关联的 session 数据?

最佳答案

首先,RTS(实时系统)必须与高性能系统区分开来。在 RTS 中,时间被分割成帧,软件有一个或多个帧分配给它们。这使得在给定时间执行哪个任务系统以及并行运行哪些其他任务变得非常可预测。因此设计有助于避免/限制并发管理。

其次,出于与 RTS 完全相同的原因,高性能系统(无论是否为 RTS)不一定依赖多线程:并发管理和阻塞结构更准确地说是瓶颈。多线程并不是并行处理的唯一解决方案。 fork 、网格计算等工作非常出色,并提供更多的可扩展性、稳定性、健壮性等。

因此,单线程环境通常基于异步设计。您将工作(即请求处理)拆分为小型非等待/阻塞结构。所有等待/阻塞(甚至是激进的长时间计算)都被发送到“某处”,并在完成时通知请求处理器。在这种情况下,一个线程可以在单个请求处理过程中处理多个请求(此时不确定是否清楚...)

在这种(以及其他一些)情况下,您不能使用线程局部绑定(bind)。但是,您可以使用“本地范围”在整个处理过程中共享引用:

Map<String, String> context = new LinkedHashMap<>();
context.put("id", "42");
taskQueue.add(() -> context.put("state", "action1"));
taskQueue.add(() -> System.out.printf("%-10s > state=%s%n", context.get("id"), context.get("state")));

(假设taskQueueRunnableQueue)

您还可以通过以下方式保存请求上下文:

  1. 生成“唯一请求标识符”(合适的类应该是 UUID )
  2. 使用请求上下文存储(可以是简单的 ConcurrentMap )或更高级的存储,例如键值缓存、键值存储或文档存储。
  3. 将“唯一请求标识符”附加到所有请求绑定(bind)操作

关于java - ThreadLocal 用于管理 session 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33083164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com