我正在尝试保留一个 singleton
类,并且我想确保它保持为单例。在 Spring WebFlux
中同步方法调用的正确方法是什么?
我有以下服务方式:
public Mono<SingletonClass> saveOrUpdate(SingletonClass singletonClass) {
return this.getTheSingletonClass()
.map(someLogicAndSave)
.switchIfEmpty(singletonClassRepository.save(singletonClass);
}
我应该在 saveOrUpdate
方法中添加 synchronized 关键字吗?
最佳答案
- 问:Spring WebFlux 中的同步方法? (或任何单声道/助焊剂)
- A:如果可以,那就找到更好的解决方案。首先,在使用 Project reactor 编写时,不要使用
synchronize
关键字。将每个函数视为流的一小部分。 Project Reactor 为您提供的工具可以更好地控制您尝试同步的流。更好的控制。其次,你不应该同步任何东西,除非你正在改变某些东西(你应该这样做主要是为了优化目的)。响应式(Reactive)编程主要是关于回调;当有人想要任务的结果时,任务就会运行,当任务完成时,有人(不是你)会调用你提供的函数,并将任务的结果作为参数。 同步意味着等待一个线程完成做某事,以便另一个线程也可以做那件事。尝试看看您是否可以将实际逻辑更改为不可变的,以便多个线程可以同时执行该逻辑。 如果没有,请继续阅读。
调用 saveOrUpdate
时,您会返回一个表示任务结果的 Mono。实际结果只有在有人订阅任务时才会出现(===你调用函数 saveOrUpdate
得到的 Mono)。换句话说,saveOrUpdate
只返回流的描述 === 当有人在流的顶部推送新值时,流应该做什么(从上到下)。
- 问:我是否应该将 synchronized 关键字添加到
saveOrUpdate
方法中? - A:不会。作为上述解释的结论,多次调用
saveOrUpdate
除了创建和返回流的描述外不会做太多事情。应该(可能)同步的方法是实际改变某些东西并且可以从多个线程同时调用的方法。
到目前为止,您已经了解了流是什么的基本知识。下一步是了解 Project Reactor(Mono
/Flux
库)中的多线程。
- 问:在 Spring WebFlux 中同步方法调用的正确方法是什么?
- A:我不确定我明白你的意思。在我解释完所有内容后,这个问题是否仍然相关?如果是,请考虑重新措辞(编辑问题)。
注意事项:
流中的表达式评估:
您应该仔细查看示例中的表达式:singletonClassRepository.save(singletonClass)
。流应该仅在有人订阅它时执行。在您的示例中,这段代码是一个表达式,当方法 saveOrUpdate
正在执行。因此,部分流甚至在有人订阅它之前就开始执行 (singletonClassRepository.save(singletonClass)
,而流的其余部分只有在有人订阅它时才会执行。
这不是一个糟糕的设计。但是如果 singletonClassRepository.save(singletonClass)
正在做一些改变,你应该考虑同步方法 saveOrUpdate
。
如何同步
仅同步 Project Reactor 提供的工具之一:concatMap
、flatMap
等。
关于java - Spring WebFlux 中的同步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54186477/