我的网络应用程序使用spring IOC。因此,我的所有spring bean都将是singleton(默认情况下)。如果两个请求尝试访问单个类的两个不同方法。例如:MySpringBean
是一个有两个方法searchRecord
和insertRecord
方法的类。如果同时在两个方法中尝试通过同一个bean访问。
当两个请求尝试访问两个不同的方法但是通过相同的spring bean时,同一个spring bean如何同时可用于两个客户端,或者它是并发问题。因为spring bean是单例,所以无法形成新实例。在这种情况下,这是如何工作的?
答案 0 :(得分:11)
您必须首先了解并发何时会导致问题。如果您的Spring bean是无状态的(它没有任何字段,所有字段都是final
或者所有字段只分配一次),多个线程可以安全地使用相同的bean,甚至是相同的方法。
答案 1 :(得分:5)
如果bean是单例,那么Spring将在任何线程中为您提供相同的实例。由你决定使这个bean线程安全。因为它是一个单身人士,所以你最好不要让这个班级无国籍。
答案 2 :(得分:5)
正如其他人已经建议的那样,Spring将在“singleton”bean的情况下为所有线程提供相同的实例。
您需要了解的是,线程通过执行代码来完成系统中的所有工作,而对象提供状态和行为(代码)。因此,多个线程(在您的情况下为请求)确实可以在单例bean中同时运行相同的方法。您可以像Tomasz建议的那样使这些bean无状态,或者使它们“线程安全”。
答案 3 :(得分:0)
Java单例和spring单例不同。 Spring单例范围将在上下文中可用。
Java单例作用域将在JVM类加载器中。因此,并发请求仅可能通过spring上下文