Lazy Loading Singletons в jdk 1.5

Март 12th, 2008 | by OleXaa |

Все уже привыкли что Singleton должен выгялдеть примерно так:

static Singleton instance;
public static synchronized Singleton getInstance() {
  if (instance == null)
    instance == new Singleton();
  return instance;
}

 

Но изменения модели памяти в jdk 1.5 делают такое решение неефективным и значительно усложняют создание Singleton.

static volatile Singleton instance;
public static Singleton getInstance() {
  if (instance == null) {
    synchronized (Singleton.class) {
      if (instance == null)
        instance == new Singleton();
    }
  }
  return instance;
}

На днях нашел интересный трик, разрешающий избежать double-lock и в тоже время гарантирует единственый екземпляр. Трик заключаеться в использовании Initialization on Demand Holder (IODH)  идиомы.

static class SingletonHolder {
  static Singleton instance = new Singleton();    
}
public static Singleton getInstance() {
  return SingletonHolder.instance;
}

You must be logged in to post a comment.