【问题标题】:Multiple HTTP request safe Multithreaded Spring boot server多个 HTTP 请求安全多线程 Spring 引导服务器
【发布时间】: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


【解决方案1】:

标准 HTTP 模型是每个请求一个线程。

新的响应式模型使用 Netty 和事件总线。

您非常清楚共享的可变数据是多线程访问的问题。你必须编写你的代码,所以它是线程安全的。使用java.util.concurrent 包。

你犯了一个错误,偏离了选择的模型。聪明的人很难写出正确的多线程代码。

【讨论】:

  • 值得一提的是,Spring 有专门的技术来透明地处理这个问题——尤其是请求范围。
【解决方案2】:

Spring 有一些功能可以帮助解决这个问题,但由于您尚未分享您的用例,因此很难提出建议…… 要解决这个特殊问题,您还可以使用不使用锁的 AtomicReference。 这是一个关于如何使用它的好教程: http://tutorials.jenkov.com/java-util-concurrent/atomicreference.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多