java - 分布式 Spring REST 服务中的线程安全

标签 java multithreading spring-mvc concurrency

我的 Spring Rest Controller 是否会通过 @Autowired 使用 @Service 类,并且 @Service 类具有关键部分 - 在实例上同步字段

privatefinalObjectmodifyIndexLock = newObject();准备好分布式部署还是我需要以其他方式同步?

底层资源是 Lucene Index Writer,在任何时间点只能打开一个 writer。当编写器已经打开时,尝试打开编写器的线程将会失败。我不希望我的线程失败,但请等待。

代码对于单个服务器应用程序部署来说工作正常,但我猜,它在分布式环境中会失败,因为每个 JVM 中都会有多个 @Service 实例,从而导致不同的锁定,而底层 protected 资源被一个。

synchronized(modifyIndexLock){
//Open & use writer the close 
}

写入器池不可用,但只有一个实例可用。

IndexWriter

最佳答案

如果您有一个分布式应用程序,那么每个实例都使用自己的锁,绝对不能保证对共享资源的独占访问。您需要使用分布式锁(例如使用 Zookeeper),或者也可以使用关系数据库来提供您需要的锁。 例如:https://www.xaprb.com/blog/2006/07/26/how-to-coordinate-distributed-work-with-mysqls-get_lock/

关于java - 分布式 Spring REST 服务中的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44499864/

相关文章:

java - 如何在正在测试的另一个类中模拟类?

java - Spring 安全 : 404 on logout

Java Config @Bean 未在其他 @Configuration 类中 Autowiring

java - 项目构建错误: Non-resolvable parent POM: Could not transfer artifact error when using RAD 9. 1

java - 有没有分析Java类和方法的访问级别的工具?

java - 在 Runnable 线程中访问 Spring bean

Python线程设计

java - 如何在长数中插入位

java - 在android测试中,当使用intent打开另一个应用程序时,如何返回到我的应用程序并继续后面的测试

java - Java程序如何在CPU之间划分(在多CPU系统中)