首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >容器在将带有bean并发的单例会话bean放到服务中时提供保证。

容器在将带有bean并发的单例会话bean放到服务中时提供保证。
EN

Stack Overflow用户
提问于 2018-02-09 09:01:57
回答 1查看 166关注 0票数 1

我有以下代码

代码语言:javascript
复制
@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在内部关注它自己的同步。
  • threadSafeObject初始化并不简单,即它访问其他bean或资源,因此它需要在容器托管代码aka @PostConstruct方法中执行,而不是在对象实例化时作为字段初始化来执行。
  • bean管理并发是必需的,因为单例bean后面的实际业务代码可以在JEE环境和非托管环境中执行。因此,统一处理同步是首选的,因此,bean管理的并发性是首选的。

直接问题:我是否需要同步threadSafeObject的初始化,从而防止可能出现的可见性问题,例如线程A处理bean的初始化,但之后,线程B没有看到threadSafeObject的正确视图?

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-11 20:22:13

问得好!我认为这是规范的相关部分(以从这里开始为例):

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

(p109第4.8.5条)

我对“不并发访问”的理解是,在@PostConstruct完成之后,需要进行一些容器同步。希望能帮上忙?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48702128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档