Java 分布式弹簧支撑服务中的线程安全

Java 分布式弹簧支撑服务中的线程安全,java,multithreading,spring-mvc,concurrency,Java,Multithreading,Spring Mvc,Concurrency,我的Spring Rest控制器是否将使用一个@Service类,通过@Autowired和@Service类在实例字段上同步一个关键部分 private final Object modifyIndexLock=new Object()准备好进行分布式部署,还是我需要以其他方式进行同步 作为Lucene索引编写器的基础资源,在任何时候,只能打开一个编写器。线程试图在写入程序已打开时打开写入程序将失败。我不想我的线程失败,但等待 代码对于单个服务器应用程序部署来说工作正常,但我想,它在分布式环境

我的Spring Rest控制器是否将使用一个
@Service
类,通过
@Autowired
@Service
类在实例字段上同步一个关键部分

private final Object modifyIndexLock=new Object()准备好进行分布式部署,还是我需要以其他方式进行同步

作为Lucene索引编写器的基础资源,在任何时候,只能打开一个编写器。线程试图在写入程序已打开时打开写入程序将失败。我不想我的线程失败,但等待

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

synchronized(modifyIndexLock){
//Open & use writer the close 
}
写入程序池不可用,但只有一个实例可用


如果您有一个分布式应用程序,那么每个实例使用自己的锁,肯定不能保证对共享资源的独占访问。您需要使用分布式锁(例如使用Zookeeper),也可以使用关系数据库来提供所需的锁。
例如,请参见:

如果您有一个分布式应用程序,那么每个实例使用自己的锁,肯定不会保证对共享资源的独占访问。您需要使用分布式锁(例如使用Zookeeper),也可以使用关系数据库来提供所需的锁。
请参阅示例:

已同步
关键字为每个JVM进程。您可以使用
@javax.EJB.Singleton
注释查看EJB规范,该注释可以跨分布式企业部署提供锁定。查看此处以了解更多信息:

已同步
关键字是每个JVM进程。您可以使用
@javax.EJB.Singleton
注释查看EJB规范,该注释可以跨分布式企业部署提供锁定。查看此处以了解更多信息:

感谢您提出将DB用于lock&zookeeper的想法。这是建议的。目前,我正在考虑在DB中保留一个标志,因为这似乎是一个更简单的解决方案。感谢您提出将DB用于lock&zookeeper的想法。这是建议的。目前,我正在考虑在DB中保留一个标志,因为这似乎是一个更简单的解决方案。