类实例-只为类创建特定数量的实例-多线程环境



需要为JVM中的特定类创建指定数量的实例

Singleton pattern类似,我们只管理和创建一个实例。

现在假设class Abc,我只想

1.)最多只创建3个实例。

2.)多线程环境。

class Abc{
  private static Abc abc1;
  private static Abc abc2;
  private static Abc abc3;
private Abc(){
}
 public static synchronized Abc getInstance1(){
        if(abc1 == null){
            abc1 = new Abc();
        }
        return abc1;
    }
: // same as above for abc2
: // same as above for abc3
}

**现在的问题是,假设我想把实例从总数3增加到4、5或n。

此外,我确实想公开这么多方法(getInstance1(), getInstance2()... etc)

看起来每个线程都需要一个实例。

有现成的解决方案,DI容器,如Guice、spring和许多其他容器。

如果你真的想自己做这件事,你可以使用映射为每个线程保留一个实例。

public class Abc {
    private static Map<Long, Abc> instances = new HashMap<Long, Abc>();
    //hiding the constructor
    private Abc() { }
    public static Abc getInstance() {
        Long threadId = Thread.currentThread().getId();
        if (!instances.containsKey(threadId)) {         
            instances.put(threadId, new Abc());
        }
        return instances.get(threadId);
    }
}

最新更新