java - 具有全局静态变量的原型(prototype) spring bean

标签 java spring concurrency

我有一个问题,我有一个基于 spring-MVC 的项目。其中有一个类包含所有用户都可以访问的所有静态变量。所有 Bean 都是单例的,这在多个用户访问应用程序时会产生问题:最后一个用户在前一个用户执行其任务的同时修改静态变量。因此,在最后一个用户之后出现的是前一个用户的数据,该数据与最后一个用户的数据重叠,这会在报告中产生冲突。我也使用原型(prototype)bean,但由于静态变量,我没有找到任何解决方案。那么有人有与这个问题相关的解决方案吗?谢谢。

最佳答案

首先:使用db,并在那里保存数据。如果您重新启动程序,用户所做的所有更改都将被丢弃。

第二:你正确地标记了它,因为这是一个并发问题:创建同步块(synchronized block),保留版本,在进入同步块(synchronized block)时检查更改是否正在更改最新版本或以前的版本: 如果您更改最新提交 - 好的,如果不是:处理异常。

第三:这设计有点糟糕。您确定需要所有用户修改一个参数吗?您是否保留修改者和修改方式的记录?单例主要用作在整个应用程序中共享信息的只读不可变对象(immutable对象)。

还有:请不要使用静态可变变量。说真的。

关于java - 具有全局静态变量的原型(prototype) spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37253047/

相关文章:

c++ - 用于同步的条件变量与原子类型

java - 有人知道 JDeveloper/SQL Developer 使用什么加密技术来持久化凭据吗?

java - CXF wsdl2java 导致 BINDING_MISSING_TYPE

java - Hibernate 功能 lower 和 upper 不适用于波兰语特殊字符

spring - 如何在 Spring 中绑定(bind)属性的字符串数组?

java - Spring 如何构造传递给 Controller ​​方法的对象?

java - AOP session 范围代理获取单例范围

c# - 我可以避免对很少更改的变量使用锁吗?

java - 如何使用 Joda 时间库计算下一个生日

database - 前向乐观并发控制的正确性