我有以下代码
@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的初始化,从而防止可能出现的可见性问题,例如线程A处理bean的初始化,但之后,线程B没有看到threadSafeObject的正确视图?
更详细的问题:当将单例会话bean投入服务时,在bean管理的并发情况下,容器是否为安全发布单例会话bean的状态提供了任何保证?我所读到的EJB规范部分并没有给出任何提示。
:对于容器管理的并发性,容器同步对单例会话bean的所有访问,因此我们保证所有线程都能看到bean的最新一致状态。对于bean管理的并发,我一直读到所有同步都留给bean的实现者,故事就在这里结束。没别的了。因此,即使容器本身不执行同步,bean初始化和向bean提供请求仍然是容器管理的,我仍然希望容器在将bean投入服务时执行写屏障。例如,JVM提供了这种保证,例如初始化,并且隐喻说JEE容器是一个腹肌撕裂的类固醇JVM,对吗?:D
发布于 2018-02-11 20:22:13
问得好!我认为这是规范的相关部分(以从这里开始为例):
独立于bean的并发管理类型,容器必须确保在实例成功完成其初始化序列(包括任何@PostConstruct生命周期回调方法)之前,不会发生对Singleton bean实例的并发访问。容器必须临时阻止在Singleton仍在初始化时到达的任何Singleton访问尝试。
(p109第4.8.5条)
我对“不并发访问”的理解是,在@PostConstruct完成之后,需要进行一些容器同步。希望能帮上忙?
https://stackoverflow.com/questions/48702128
复制相似问题