Java 单例实例的ConcurrentHashMap
我在quora()上看到了一个答案,建议创建一个ConcurrentHashMap,其中的单例实例“由一个标识字符串键入”,但我不确定这是如何工作的。以下是我的尝试:Java 单例实例的ConcurrentHashMap,java,singleton,concurrenthashmap,Java,Singleton,Concurrenthashmap,我在quora()上看到了一个答案,建议创建一个ConcurrentHashMap,其中的单例实例“由一个标识字符串键入”,但我不确定这是如何工作的。以下是我的尝试: public class SingletonClass { static ConcurrentHashMap<String, SingletonClass> list = new ConcurrentHashMap<String, SingletonClass>(); private static Si
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;
}
public类SingletonClass{
静态ConcurrentHashMap列表=新ConcurrentHashMap();
私有静态SingletonClass实例=null;
静态字符串名;
公共单音类(){
this.name=“”;
}
公共单例类(字符串名称){
this.name=名称;
}
公共单例类getInstance(字符串键){
SingletonClass结果=list.get(键);
如果(结果==null){
实例=新的SingletonClass(名称);
列表。putIfAbsent(键、实例);
结果=实例;
}
返回结果;
}
公共字符串getName(){
返回此.name;
}
公共void集合名(字符串名){
this.name=名称;
}
我不知道如何继续,也不知道如何创建该实例,并在列表中存储一个键、值对,然后根据特定键再次检索该值?如有任何帮助,将不胜感激。- 您正在创建多个实例,那么这是一个单实例吗?不是
在任何情况下都应该是静态的getInstance()
- 您在
方法中使用一个静态变量是毫无原因的,您可以通过这种方式将此代码打开到一个竞速条件(好吧,多个竞速条件)。并且此变量是不必要的,请在该方法的范围内执行所有操作getInstance()
- 这不是一个单例模式,这是一个对象的集合-与Java中的包装类(Integer、Long等)相同
//使用您的方法
SingletonClass one=SingletonClass.getInstance(“someKey”);
SingletonClass 2=SingletonClass.getInstance(“someKey”);
System.out.println(one==two);//true,同一个对象
//没有你的方法
SingletonClass三=新的SingletonClass(“someKey”);
SingletonClass四=新的SingletonClass(“someKey”);
System.out.println(三==四);//false,不同的对象
节省内存,可能是创建对象的时间,也可能是gc周期的时间。- 您正在创建多个实例,那么这是一个单实例吗?不是
在任何情况下都应该是静态的getInstance()
- 您在
方法中使用一个静态变量是毫无原因的,您可以通过这种方式将此代码打开到一个竞速条件(好吧,多个竞速条件)。并且此变量是不必要的,请在该方法的范围内执行所有操作getInstance()
- 这不是一个单例模式,这是一个对象的集合-与Java中的包装类(Integer、Long等)相同
//使用您的方法
SingletonClass one=SingletonClass.getInstance(“someKey”);
SingletonClass 2=SingletonClass.getInstance(“someKey”);
System.out.println(one==two);//true,同一个对象
//没有你的方法
SingletonClass三=新的SingletonClass(“someKey”);
SingletonClass四=新的SingletonClass(“someKey”);
System.out.println(三==四);//false,不同的对象
节省内存,可能是创建对象的时间,也可能是gc周期的时间。1.使构造函数私有化,2.使用
SingletonClass.getInstance(“任意”)创建对象;
。getInstance
方法处理单例作为单例的问题,只要构造函数是私有的,并且不在类中的任何其他地方使用。@dan1st如果我想跨不同的类创建多个单例类对象并能够调用它们,该怎么办?使用一个静态“寄存器”类有所有单例的映射。创建时,一个类调用register类中的一个方法来注册它或失败/返回对象。我对你的措辞有点困惑。你想实例化多个单例类吗?如果是,你不想。单例的重点是该类只有一个实例。如果你想要获取对该单例的多个引用,getInstance()
方法应该是public
和static
,这样就可以从程序中的任何地方调用它来获取引用。@TimHunter感谢您的回答,并对混淆表示歉意;事实上,我的意思是实例化多个单例类,我想知道是否可以实现它?我觉得我可能误解了I来自Quora的初始答案…1.使构造函数私有,2.使用SingletonClass.getInstance(“任意”)创建对象;
。getInstance
方法处理单例作为单例的问题,只要构造函数是私有的,并且不在类中的任何其他地方使用。@dan1st如果我想跨不同的类创建多个单例类对象并能够调用它们,该怎么办?使用一个静态“寄存器”类有所有单例的映射。创建时,一个类调用register类中的一个方法来注册它或失败/返回对象。我对你的措辞有点困惑。你想实例化多个单例类吗?如果是,你不想。单例的重点是该类只有一个实例。如果你想要获取对该单例的多个引用,getInstance()
方法应该是public
和static
,这样就可以从程序中的任何地方调用它来获取引用。@TimHunter感谢您的回答,并对混淆表示歉意;事实上,我的意思是实例化多个单例类,我想知道是否可以实现它?我觉得我可能误解了IQuora的初步回答…感谢您的回答-我觉得我可能误解了Quora关于单例实例ConcurrentHashMap的回答。您的单例类3和单例类4的示例与我试图创建的一致