我有以下代码:
public class EntityManagerFactoryProviderImpl implements EntityManagerFactoryProvider {
private EntityManagerFactory entityManagerFactory=null;//line XXX
public EntityManagerFactory getFactory(){
if (entityManagerFactory==null){
buildFactory();
}
return entityManagerFactory;
}
private synchronized void buildFactory(){
if (entityManagerFactory!=null){
return;
}
entityManagerFactory=...
}
}
因此,我只需要创建一次
entityManagerFactory
实例-首次调用getFactory()
时。在这种情况下,我是否必须在XXX行上将变量
entityManagerFactory
设置为volatile?另外,
EntityManagerFactoryProviderImpl
是OSGI Singleton声明式服务,因此始终只有此类的一个实例。 最佳答案
从理论上讲,多个线程可以并行调用代码。由于没有使用volatile,线程A看不到线程B所做的更新。我自己从未遇到过这种行为,但是请问:有可能,当发生这种情况时,由于有两个实例,可能会产生非常奇怪的错误。相同的单身人士。
您可以学习此SEI cert site以获得对该主题的完整讨论。
关于java - 使用volatile关键字创建一个实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43413015/