4

如果我正确理解 EJB,@Singleton 实际上与普通 Java 中的 Singleton 和 spring 中的 Singleton 相同 -> 一个实例,每个调用同时通过同一个实例。@Stateless 声明了一个 bean,它可以(但不能)有多个实例,但限制是只能在一个实例中同时调用一个。到目前为止对吗?这仍然是 servlet 编程模型:理论上允许 servlet 容器制作 servlet 的多个副本,实际上我还没有看到任何 servlet 容器可以这样做。因此,假设我的代码中没有真正有限的资源,如门、窗或打印机(如果我这样做了,我仍然可以用队列和其他东西来解决它),真正的例子是什么,使用 @Stateless 比使用@Singleton。

问候莱昂

4

2 回答 2

1

You can have multiple instances of a stateless bean to increase throughput.

On the other hand there is only one instance of a singleton. The reason for this is normally to share state in application scope, serializes access to resources etc., and this implies locking or synchronization.

So if you are not really having a singleton, then use a stateless bean.

If you have a "stateless singleton", there is no difference. But if you read "singleton", it has a special meaning by convention (= there must be a reason for using the singleton pattern).

于 2013-06-14T19:51:17.713 回答
0

无状态意味着 bean 是线程安全的。这是因为 bean 中没有依赖状态的代码。这意味着运行它的任何方法都不会影响这些方法的未来运行。

无状态类的一个示例是执行加法和减法的类。所有必要的参数都传递到该方法中。进行加法或减法不会改变这些方法在以后调用时的工作方式。这意味着您无需担心与类的并发性。

单例通常用于创建成本非常高的类,例如数据库连接。您不希望每个类在每次需要使用数据库时都创建一个新的数据库连接,以便在程序启动时将其实例化一次。作为一个单例并不一定意味着该类是线程安全的(尽管它绝对应该是)。

所以无状态意味着该类是线程安全的。

单例是指类只创建一次。虽然这在很大程度上暗示了该类是(并且应该是)线程安全的,但它并不像无状态那样直接暗示它。

于 2013-06-14T19:16:19.550 回答