Initialization-on-demand holder 习语的疑惑

Doubts in Initialization-on-demand holder idiom

请参考link:Initialization-on-demand holder idiom

我有以下疑惑:

1) 何时在 java 中初始化内部静态 class?它是否与class的其他静态变量同时初始化?还是按需初始化。

2) 这种模式是否适合为 map/list 提供单例、线程安全访问和延迟加载。该地图将保存繁重的 sql 查询的结果。对该地图的访问需要是单例的、线程安全的并且地图应该按需初始化。

3) 这些行是什么意思:

However, the idiom is singleton-specific and not extensible to pluralities of objects (eg a map-based cache).

具体来说:

not extensible to pluralities of objects (eg a map-based cache).

对于类似的东西,我建议你使用 Double Checked Locking

一个简单的例子:

package foo;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;


public class ExampleLazyLoad {

  private volatile ConcurrentMap<String, String> myExpensiveCache = null;


  public ConcurrentMap<String, String> getMyExpensiveMap() {
    if (myExpensiveCache == null) {
      synchronized (this) {
        if (myExpensiveCache == null) {
          final ConcurrentMap<String, String> newCache = new ConcurrentHashMap<String, String>();
          // init the map
          myExpensiveCache = newCache;
        } // if
      } // synchronized
    } // if
    return myExpensiveCache;
  }

}

class 的静态成员在第一次请求 class 时初始化(如果我错了,请打我)。

这总是取决于你真正需要什么。我不是单身人士的忠实粉丝,但这总是取决于用例。

如果您只使用 getMyExpensiveMap() 函数访问缓存,我​​发布的代码是线程安全的。