我有一些 java 类,其中的成员变量都是 Autowired
使用 Spring bean。我认为这保证了单例模式。但我想知道代码如何在生产服务器上运行?单例是保证每个线程还是全局保证?我应该如何考虑开发中的并发性。
编辑
一个例子: 接受请求并响应它收到的请求数的类。 在这种情况下我们需要保证计数器的全局单例,对吗?比如说无论我们使用多少台服务器,应该只有一个计数器。这个保证是隐含的吗?
最佳答案
经典单例和Spring单例的范围
单例一般是指运行在JVM上的整个应用程序的单例。
这是您自己实现的 Java 经典实现的情况(单例双重检查惯用语、枚举惯用语、按需初始化持有者惯用语等等)。
在这些情况下,单例确实是在单例类的类加载时创建的,因此由 JVM 单例创建。
Spring 单例的工作方式略有不同。
他们确实依赖于容器。所以,如果你在同一个 JVM 中创建多个容器,你可能会创建多个单例。现在它真的是一个极端情况,而且这些单例 bean 之间是隔离的。所以不要关注它。
关于并发
单例没有任何并发问题,因为它们是不可变的。
当然,你可以在单例中定义依赖和属性。
但是这些在单例实例化之后不应该改变。
事实上,如果一个单例提供了允许改变其状态的方法,那么对于操作它的不同线程,您一定会遇到竞争条件。
所以作为一个提示,保持你的单例不可变或尽可能不可变。
如果这些不能完全不可变,则必须确保通过同步需要的方法/字段来处理竞争条件。
关于java - 如何在生产代码中考虑单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48928343/