当前位置: 首页 > 知识库问答 >
问题:

当将具有bean并发性的单例会话bean投入服务时,容器保证

苏野
2023-03-14

我有以下代码:

@ConcurrencyManagement(BEAN)
@Startup
@Singleton
public class MySingletonBean {

    private Object threadSafeObject;

    @PostConstruct
    private void init() {
        threadSafeObject = nonTrivialInitialization();
    }

    private void nonTrivialInitialization() {
        // something with other beans or container resources
    }

    public void accessObject() {
        threadSafeObject.performSomeThreadSafeOperation();
    }

}

情况如下:

  • threadSafeObject是并发访问的(显然)

直接问题:我是否需要同步threadSafeObject的初始化,从而同步对它的所有其他访问,以防止可能的可见性问题,例如html" target="_blank">线程A处理bean的初始化,但之后线程B看不到threadSafeObject的正确视图?

更详细的问题:当将单例会话bean投入服务时,在bean管理的并发情况下,容器是否提供关于安全发布单例会话bean状态的任何保证?EJB规范[我读过的部分]没有给出任何关于这方面的提示。

从我的角度来看,更多的问题是:对于容器管理的并发性,容器同步对单例会话bean的所有访问,因此我们保证所有线程都能看到bean的最新一致状态。对于bean管理的并发性,我一直在读到所有同步都留给bean的实现者,故事到此结束。没别的了。因此,即使容器本身不执行同步,bean初始化和向bean发送请求仍然是容器管理的,我仍然希望容器在将bean投入服务时以某种方式执行写障碍。例如,JVM为实例初始化提供了这种保证,比喻说JEE容器是一个有着撕裂腹肌的JVM,对吗D

共有1个答案

充鑫鹏
2023-03-14

好问题!我认为这是规范的相关部分(取自此处):

与bean的并发管理类型无关,容器必须确保在实例成功完成其初始化序列(包括任何@PostConstruct生命周期回调方法)之前不会并发访问Singleton bean实例。容器必须暂时阻止在Singleton仍在初始化时到达的任何Singleton访问尝试。

(第4.8.5节,第109页)

我对“无并发访问”的理解是@PostConstruct完成后需要一些容器同步。希望有帮助?

 类似资料:
  • > 在EJB3.0及其之前的版本中,该问题是如何处理的? 如果它保留了客户端特定的会话状态,那么单个实例将拥有所有客户端(试图并发访问)的特定数据?它会安全吗?? 如果我们可以在其他会话bean中使用静态最终变量和静态初始值设定项块或静态方法来初始化它们(因为静态变量也是每个类的数据,而不是每个实例的数据),以便跨bean共享公共数据,那么单例会话bean需要什么呢? 在singleton中使用业

  • 我与一位同事讨论了单例会话bean中的并发管理。根据我的理解,在阅读了Oracle文档之后,如果您取消了注释,那么它默认为容器管理的并发。在文档中,它说明了以下关于容器管理的单例会话bean的内容: javax.ejb.Lock注释和javax.ejb.LockType类型用于指定单例业务方法或@Timeout方法的访问级别。 和 如果singleton类上不存在@Lock注释,则默认的锁类型@L

  • 我需要确保给定的 bean 是使用会话范围定义的。 我知道我可以使用或,其中是我的(Web)Application Context,但是,没有。 如果你想知道为什么我需要这样的东西,请检查这个问题。 相关:我可以以编程方式确定Spring bean是否不是单例吗?

  • 如果使用EJB3单例会话Bean,那么让ConcurrentHashMap状态变量-correct没有意义?我可以只使用一个由容器并发管理器管理的常规HashMap?

  • 我刚接触Spring,正在尝试理解“将一个原型bean注入一个单例bean”的概念。根据我在singleton中的理解,每个Spring IoC容器只有一个实例,不管您检索它多少次。,因为仍未实例化。我开发了以下示例,其中在单个bean中给出了原型bean的参考,如下所示: RequestProcessor.java requestValidator.java 如何解决?我的理解正确吗? 另一种方

  • 问题内容: 我有一个无状态会话bean,其中包含一个公共方法,几个私有方法和一些实例级变量。下面是一个伪代码示例。 我看到的是methodB正在打印未传递给MethodA的值。最好的说来,它是从同一bean的其他实例打印值。是什么原因造成的? 我应该指出代码在99.9%的时间内都能正常工作。但是,.01%对我造成了一些严重的问题/担忧。 我知道,如果我使用不同的公共方法,则两次调用之间可能无法获得