如何用Java Core实现跨REST API调用维持内存用户列表状态?
内存跨REST API维持用户列表的实现方案
一、用单例类存储用户列表
你考虑用单例类是完全可行的,因为单例在JVM内是全局唯一的,能保证不同API调用共享同一套数据。这里推荐用枚举实现单例(JVM原生保证线程安全和实例唯一性,比双重检查锁更可靠),同时搭配线程安全的集合来存储用户,避免多线程并发调用时出问题。
示例代码:
import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; // 枚举单例的用户存储类 public enum UserStorage { INSTANCE; // 全局唯一实例 // 用CopyOnWriteArrayList保证多线程下的安全读写(适合读多写少的场景) private final List<User> userList = new CopyOnWriteArrayList<>(); // 添加用户方法 public void addUser(User user) { userList.add(user); } // 获取所有用户:返回不可变副本,避免外部直接修改内部集合 public List<User> getAllUsers() { return List.copyOf(userList); } // 可选:根据ID查询单个用户 public User getUserById(String userId) { return userList.stream() .filter(user -> user.getId().equals(userId)) .findFirst() .orElse(null); } } // 简单的User实体类 class User { private String id; private String name; public User(String id, String name) { this.id = id; this.name = name; } // getter方法 public String getId() { return id; } public String getName() { return name; } }
二、在REST API中集成单例存储
以Spring Boot的接口为例,写两个核心API:保存用户和查询用户列表,直接调用单例的方法即可实现状态共享。
示例Controller代码:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class UserController { // 保存用户的POST接口 @PostMapping("/users") public String addUser(@RequestBody User user) { UserStorage.INSTANCE.addUser(user); return "用户添加成功"; } // 查询所有用户的GET接口 @GetMapping("/users") public List<User> getAllUsers() { return UserStorage.INSTANCE.getAllUsers(); } }
调用POST /users添加用户后,再调用GET /users就能获取到之前添加的所有用户,实现跨API调用的状态维持。
三、关键注意事项
- 线程安全必须重视:绝对不能用普通的
ArrayList,多线程并发修改会抛出异常,推荐用CopyOnWriteArrayList或ConcurrentHashMap(如果用ID做键存储)。 - 数据会随应用重启丢失:这种内存存储是临时的,应用重启后所有用户数据都会清空,如果需要持久化,得搭配数据库或Redis。
- 集群部署不适用:如果你的服务是多实例集群部署,每个JVM都有自己的单例数据,实例间无法共享,这种情况要改用分布式缓存或数据库来统一存储。
- 内存容量限制:如果用户量过大,内存存储可能导致OOM,需要定期清理过期数据或扩容JVM内存。
内容的提问来源于stack exchange,提问作者sadia
相关产品推荐
相关产品推荐

