【发布时间】:2019-01-23 17:21:52
【问题描述】:
在 Spring 引导服务器中,我的 Rest 控制器类是多线程的,并且许多线程共享(读取和写入)同一个 HTTP 请求的变量。该程序对于 1 个 HTTP 请求是线程安全的。
但我在程序中有一些静态变量,用于在同一 HTTP 请求的 Java 线程之间共享信息。
我知道当多个 HTTP 请求一起到达时会产生问题。
我应该如何让程序/服务器同时接受多个 HTTP 请求,而又不弄乱 2 个不同 HTTP 请求的变量 'logger' 、'abc' 、 'xyz'?
如何声明和使用这些变量?
@RestController
public class ABC {
private static final Logger logger = LoggerFactory.getLogger(ABC.class);
private static volatile byte[] abc = null;
static volatile boolean xyz = "true"
// Multithreaded program where multiple threads read and write
both 'abc' and 'xyz'
【问题讨论】:
-
“我在程序中有一些静态变量,用于在同一个 HTTP 请求的 Java 线程之间共享信息” - 为什么?您正在使用 Spring,所以 使用 Spring - 这就是请求范围的用途!
-
我不相信 RestController 有充分的理由保持状态。请详细说明您认为应该共享哪些信息,而不是被多个线程“搞砸”。
-
多个线程共享(读取和写入)同一个 HTTP 请求的变量?不是一个请求一个线程吗?
-
@LucasRoss 我不希望 RestController 保持状态。静态变量“abc”和“xyz”实际上是多个 java 线程为同一个 HTTP 请求共享的一些变量。为什么我选择那些变量“abc”和“xyz”是静态的?因为我不知道哪个线程将写入该变量以及何时写入。但是一旦写出来-我希望其他线程知道。
-
“保持状态”的通常含义是您所描述的:写入变量以便其他东西可以获得更新的值。正如其他答案所指出的,在控制器 bean 中保持状态是 Spring MVC 和大多数其他模型的反模式。通常,您使用数据库、会话、请求范围和其他东西来处理状态。
标签: java spring multithreading spring-boot static