gpt4 book ai didi

java - 并发请求的 repo 类线程安全吗? - Spring Boot

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:45:24 25 4
gpt4 key购买 nike

我正在为一个 Web 应用程序使用带有 Jetty 嵌入式 Web 服务器的 Spring Boot。我想 100% 确定 repo 类是线程安全的。

repo 类

@Repository
@Scope("prototype")
public class RegistrationGroupRepositoryImpl implements RegistrationGroupRepository {

private RegistrationGroup rg = null;
Integer sLastregistrationTypeID = 0;
private UserAccountRegistration uar = null;
private List<RegistrationGroup> registrationGroup = new ArrayList<>();

private NamedParameterJdbcTemplate jdbcTemplate;


@Autowired
public RegistrationGroupRepositoryImpl(DataSource dataSource) {
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}

public List<RegistrationGroup> getRegistrationGroups(Integer regId) {
// Some logic here which is stored in stored in the instance variables and registrationGroup is returned from the method

return this.registrationGroup;
}

以及从存储库调用 getRegistrationGroups 方法的服务类。

@Service
public class RegistrationService {

@Autowired
private Provider<RegistrationGroupRepository> registrationGroupRepository;

public List<RegistrationGroup> getRegistrationGroup() {
return registrationGroupRepository.getRegistrationGroups(1);
}

}

如果两个或多个请求执行 getRegistrationGroups(1) 方法,是否会出现竞争条件情况?我想我是出于安全考虑,因为我正在使用带有原型(prototype) bean 的方法注入(inject)(提供程序),并且每次我都从调用中获取新实例?

最佳答案

首先,使您的 Bean 成为原型(prototype) Bean 并不能确保为每个方法调用(或每次使用,无论什么)创建一个实例。

在您的情况下,由于 Provider 的使用,您在这一点上没问题。
但是我注意到您正在直接访问 getRegistrationGroups

return registrationGroupRepository.getRegistrationGroups(1);

这段代码如何编译?您应该在 Provider 实例上调用 get()

return registrationGroupRepository.get().getRegistrationGroups(1);

回答您的问题,您应该可以使用此代码。我不喜欢您在 RegistrationGroupRepositoryImpl 中维护某种状态,但这是您的选择。

我总是喜欢将我的所有字段设置为 final。如果其中一个要求我删除 final 修饰符,则设计有问题。

关于java - 并发请求的 repo 类线程安全吗? - Spring Boot ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54736253/

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