我有一些java类,其中成员变量都是使用Spring bean的Autowired
。我认为这保证了单身模式。但我想知道代码是如何在生产服务器上运行的?单线程是否保证每个线程还是全球保证?我应该如何考虑开发中的并发性。
修改
一个例子: 一个类接收请求并响应它收到的请求数。 在这种情况下,我们需要保证柜台的全局单身,对吗?无论我们使用多少台服务器,都应该只有一台计数器。这种保证是隐含的吗?
答案 0 :(得分:6)
经典单身人士和春季单身人士的范围
Singleton通常表示在JVM上运行的整个应用程序的单例 对于您自己实现的Java经典实现就是这种情况(单例双重检查成语,枚举成语,按需初始化持有者惯用语,等等)。 在这些情况下,单例确实是在单例类的类加载上创建的,所以JVM只需要一次。
春季单身人士的工作方式略有不同 他们确实依赖于容器。因此,如果在同一JVM中创建多个容器,则可以创建多个单例。现在它真的是一个极端情况,除了这些单独的豆之间是隔离的。所以不要专注于它。
关于并发
Singletons没有任何并发问题,而这些问题是不可变的 当然,您可以在单例中定义依赖项和属性。 但是在单例实例化之后这些不应该改变 实际上,如果单例提供允许更改其状态的方法,则必然会为操纵该方法的不同线程设置竞争条件。
所以作为一个提示,让你的单身人士不变或尽可能不变 如果这些不能完全不可变,则必须通过同步需要的方法/字段来确保处理竞争条件。