为了账号安全,请及时绑定邮箱和手机立即绑定

Java中的线程安全多态

Java中的线程安全多态

12345678_0001 2019-11-02 14:31:42
鉴于以下多态: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()方法同步和双重检查锁定争议的情况下使它保持线程安全和懒惰?这里提到了单例的有效方法,但似乎并没有扩展到多例。
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

这将为您提供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;

}


查看完整回答
反对 回复 2019-11-02
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

您可以使用一组锁,至少能够同时获取不同的实例:


private static final Multiton[] instances = new Multiton[...];

private static final Object[] locks = new Object[instances.length];


static {

    for (int i = 0; i < locks.length; i++) {

        locks[i] = new Object();

    }

}


private Multiton(...) {

    //...

}


public static Multiton getInstance(int which) {

    synchronized(locks[which]) {

        if(instances[which] == null) {

            instances[which] = new Multiton(...);

        }

        return instances[which];

    }

}


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 354 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信