java - 如何在生产代码中考虑单例?

标签 java concurrency server singleton production

我有一些 java 类,其中的成员变量都是 Autowired 使用 Spring bean。我认为这保证了单例模式。但我想知道代码如何在生产服务器上运行?单例是保证每个线程还是全局保证?我应该如何考虑开发中的并发性。

编辑

一个例子: 接受请求并响应它收到的请求数的类。 在这种情况下我们需要保证计数器的全局单例,对吗?比如说无论我们使用多少台服务器,应该只有一个计数器。这个保证是隐含的吗?

最佳答案

经典单例和Spring单例的范围

单例一般是指运行在JVM上的整个应用程序的单例。
这是您自己实现的 Java 经典实现的情况(单例双重检查惯用语、枚举惯用语、按需初始化持有者惯用语等等)。
在这些情况下,单例确实是在单例类的类加载时创建的,因此由 JVM 单例创建。

Spring 单例的工作方式略有不同。
他们确实依赖于容器。所以,如果你在同一个 JVM 中创建多个容器,你可能会创建多个单例。现在它真的是一个极端情况,而且这些单例 bean 之间是隔离的。所以不要关注它。


关于并发

单例没有任何并发​​问题,因为它们是不可变的。
当然,你可以在单例中定义依赖和属性。 但是这些在单例实例化之后不应该改变。
事实上,如果一个单例提供了允许改变其状态的方法,那么对于操作它的不同线程,您一定会遇到竞争条件。

所以作为一个提示,保持你的单例不可变或尽可能不可变。
如果这些不能完全不可变,则必须确保通过同步需要的方法/字段来处理竞争条件。

关于java - 如何在生产代码中考虑单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48928343/

相关文章:

node.js - 如何在端口 80 上部署第二台服务器(听 EADDRINUSE:::80)

java - 确保方法只能由选定的方法执行

java - 监听器和线程

java - 我如何访问 vaadin 树中的对象?

mysql - 重叠日期时间的最大数量,有多个开始和结束时间

java - 实现生产者消费者模式

Java - 不可变数组线程安全

javascript - 代理阻止 websockets?如何绕行

c# - 通过 tcp 拆分消息

java - 为什么从 Docker 镜像的 jar 文件已损坏?