我有以下代码:

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/

10-12 00:37