【发布时间】:2018-09-06 04:48:51
【问题描述】:
假设我有一个名为 Assignment 的 DAO,它使用 @Document 映射声明,并带有一个 mongo 集合名称 Assignment。
然后我有一个服务 bean,例如 AssigmentImpl,它在单例范围内,执行更新操作,它获取持久的 DAO 并使用分配的 REST 输入数据更新一些。
@Service
public class AssignmentImpl{
public Assignment updateAssignment(Assignment assignment){
Assignment assignmentExsisting = assignmentRepo.getAssignment(assignment.getId());
BeanUtils.copyProperties(assignment,assignmentExsisting);
assignmentRepo.save(assignmentExsisting);
}
}
假设多个线程(用户)对不同的分配执行更新操作。
AssignmentService 是单例的,它会将相同的副本返回给不同的用户。它如何引用 Assignment 对象?如果我说,由于Assignment对象不是单例的,所以当每个用户进行更新操作时,它会返回不同的对象引用到AssignmentImpl,对吗?
在这种情况下,用户 A 可能会在执行更新操作之前获得分配 id 123,而当用户 B 开始执行更新操作时,AssignmentImpl 会将分配引用更改为不同的分配 id 456。在这种情况下,用户 A 将更新完全不同的分配.那有可能吗?如果是这样,我们该如何预防?让更新操作同步还是有什么好的解决办法?
【问题讨论】:
-
没有问题。
assignment对于调用者来说是本地的,而不是完整的对象。所以他们看不到彼此的数据。除非您将其存储在对象级实例变量中(您不这样做),否则您可能会在不同线程之间共享状态。
标签: java spring multithreading spring-boot thread-safety