我的 Spring Rest Controller 是否会通过 @Autowired
使用 @Service
类,并且 @Service
类具有关键部分 - 在实例上同步字段
privatefinalObjectmodifyIndexLock = newObject();
准备好分布式部署还是我需要以其他方式同步?
底层资源是 Lucene Index Writer,在任何时间点只能打开一个 writer。当编写器已经打开时,尝试打开编写器的线程将会失败。我不希望我的线程失败,但请等待。
代码对于单个服务器应用程序部署来说工作正常,但我猜,它在分布式环境中会失败,因为每个 JVM 中都会有多个 @Service
实例,从而导致不同的锁定,而底层 protected 资源被一个。
synchronized(modifyIndexLock){
//Open & use writer the close
}
写入器池不可用,但只有一个实例可用。
最佳答案
如果您有一个分布式应用程序,那么每个实例都使用自己的锁,绝对不能保证对共享资源的独占访问。您需要使用分布式锁(例如使用 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/