初始化按需持有人习语的疑问

时间:2015-02-19 08:28:08

标签: java thread-safety singleton lazy-loading

请参阅链接:Initialization-on-demand holder idiom

我有以下疑问:

1)什么时候在java中初始化内部静态类?它是否与该类的其他静态变量同时初始化?或者是按需初始化。

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

3)这些线是什么意思:

  

然而,这个成语是单身特定的,不可扩展   多个对象(例如基于地图的缓存)。

具体来说:

  

不可扩展到多个对象(例如基于地图的缓存)。

1 个答案:

答案 0 :(得分:0)

对于类似的东西,我建议您使用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;
  }

}

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

它总是取决于你真正需要的东西。我不是单身人士的真正粉丝,但它总是取决于用例。

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