【问题标题】:Interaction of Instance DAO and Singelton Bean in SpringSpring中Instance DAO与Singelton Bean的交互
【发布时间】: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


【解决方案1】:

不,这不是您的想法,请注意,即使服务类是单例的,每次更新调用都不会与任何其他方法调用的执行重叠,因为两者都将在服务器创建的不同线程中执行。因此,操作将按照给定的分配进行,两个用户的结果不会互换,为什么?因为每个线程独立执行方法但是当两个线程尝试修改状态时就会出现问题共享元素,即更改服务方法中在类级别声明的对象的值。

例如,两辆公共汽车从 A 点出发到 B 点。现在,没有一辆公共汽车有共享乘客(这不可能吧?),它们都有自己的乘客和自己的燃料,但是机制(存储库和服务) ) 两辆公共汽车保持不变。

据我所知,你看到两个线程在这里没有共享任何东西,是的,它使用存储库 bean,但它不会修改它的状态,它只会将分配发送到存储和 id 以检索分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2011-05-07
    • 2013-01-23
    • 2012-06-01
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多