鉴于以下多态:

public class Multiton
{
    private static final Multiton[] instances = new Multiton[...];

    private Multiton(...)
    {
        //...
    }

    public static Multiton getInstance(int which)
    {
        if(instances[which] == null)
        {
            instances[which] = new Multiton(...);
        }

        return instances[which];
    }
}

我们如何在没有昂贵的getInstance()方法同步和双重检查锁定争议的情况下使它保持线程安全和懒惰? here提到了单例的一种有效方法,但这似乎并没有扩展到多例。

最佳答案

这将为您的Multitons提供一个线程安全的存储机制。唯一的缺点是可以创建不会在 putIfAbsent()调用中使用的Multiton。可能性很小,但确实存在。当然,即使确实发生了这种偶然的机会,它仍然不会造成任何伤害。
从好的方面来说,不需要预分配或初始化,也没有预定义的大小限制。

private static ConcurrentHashMap<Integer, Multiton> instances = new ConcurrentHashMap<Integer, Multiton>();

public static Multiton getInstance(int which)
{
    Multiton result = instances.get(which);

    if (result == null)
    {
        Multiton m = new Multiton(...);
        result = instances.putIfAbsent(which, m);

        if (result == null)
            result = m;
    }

    return result;
}

09-11 10:55