【问题标题】:ConcurrentHashMap of Singleton Instances单例实例的 ConcurrentHashMap
【发布时间】:2020-08-04 19:40:18
【问题描述】:

我在 quora (https://www.quora.com/Can-we-create-mulitple-instances-of-singleton-classes-in-Java-if-so-how-if-not-then-why) 上看到了一个答案,该答案建议创建一个单例实例的 ConcurrentHashMap '由标识字符串键入',但我不确定这将如何工作。这是我的尝试:

public class SingletonClass {

static ConcurrentHashMap<String, SingletonClass> list = new ConcurrentHashMap<String, SingletonClass>();

private static SingletonClass instance = null;

static String name;

public SingletonClass() {
    this.name = "";
}

public SingletonClass(String name) {
    this.name = name;
}

public SingletonClass getInstance(String key) {
    SingletonClass result = list.get(key);
    if(result == null) {
        instance = new SingletonClass(name);
        list.putIfAbsent(key, instance);
        result = instance;
    }
    return result;
}

public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

我不知道如何继续或如何创建它的实例并将键值对存储在列表中,然后根据特定键再次检索值?任何帮助将不胜感激。

【问题讨论】:

  • 1.将构造函数设为私有, 2. 使用SingletonClass.getInstance("whatever"); 创建对象。 getInstance 方法负责将单例作为单例,只要构造函数是私有的并且不在类中的其他任何地方使用。
  • @dan1st 如果我想跨不同的类创建多个 SingletonClass 对象并能够调用它们怎么办?
  • 使用一个静态“注册”类有所有单例的映射。创建时,类调用 register 类中的方法注册它或失败/返回对象
  • 我对你的措辞有点困惑。您是否希望实例化多个 Singleton 类?如果是这样,你不知道。单例的要点是该类只有一个实例。如果您希望获得对该 Singleton 的多个引用,getInstance() 方法应该是 publicstatic,以便可以从程序中的任何位置调用它来获取引用。
  • @TimHunter 感谢您的回复并为造成的混乱道歉;实际上我的意思是实例化多个 Singleton 类,并且想知道它是否可以实现?我觉得我可能误解了 Quora 的最初答案......

标签: java singleton concurrenthashmap


【解决方案1】:
  • 您正在创建多个实例,那么那是一个单例吗?这不是
  • getInstance() 在任何情况下都应该是静态的
  • 您在getInstance() 方法中无缘无故地使用了一个静态变量,您以这种方式将此代码打开到一个赛车条件(嗯,多个赛车条件)。而且这个变量是不必要的,在这个方法的范围内做所有事情
  • 这不是单例模式,这是 flyweight 对象的 object pool - 与 Java 中的包装类(Integer、Long 等)相同

关键是,使用这种方法,不会有 2 个对象具有相同的键。

// with your approach
SingletonClass one = SingletonClass.getInstance("someKey");
SingletonClass two = SingletonClass.getInstance("someKey");

System.out.println(one == two); // true, same object

// without your approach
SingletonClass three = new SingletonClass("someKey");
SingletonClass four = new SingletonClass("someKey");

System.out.println(three == four); // false, different objects

节省内存、对象创建时间和 gc 循环时间。

【讨论】:

  • 感谢您的回复 - 我觉得我可能误解了 Quora 关于单例实例的 ConcurrentHashMap 的答案。您的 SingletonClass 3 和 SingletonClass 4 示例与我尝试创建的内容一致,然后能够从其他类调用这些方法。
猜你喜欢
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
相关资源
最近更新 更多