是这样的,我有一个类,不同的参数只需要一个实例,可能有1000多个参数,但每次程序运行时候可能只需要10几个实例而已(单例就可以)。
所以我想单例用懒汉的模式去实现,需要的时候才实例化,否则实例化1000多个太浪费。现在的问题是,怎么写一个工厂去实例化单例的对象,总不能写1000多个if语句判断每个参数对应的实例有没有初始化吧。我不想用synchronized方法,这样多线程同步会消耗太多性能。
如果不加单例的话这样就可以
public class Factory{
public static MyClass create(String arg){
return new MyClass(arg);
}
}
现在问题就是参数太多了单例怎么实现
多线程不加锁.?
应该有一个字典集合,来存储可能被创建的这1000个对象,
然后可以不用if直接用字典集合来检索是否创建了这个对象就可以了.
那访问字典还是要加锁吧
加锁的话每次都得加 但是初始化一次实际上就不用再加了
@第8感超人: 你可以加读写锁,
不知道java有没有ReaderWriterLock?
创建一个hashmap用来存放单例。key是参数,value是单例。
public class Factory{
//定义map
public static MyClass create(String arg){
//如果map.get(arg)存在,返回单例。
//否则,创建单例,并加到map中。
}
}
按你所说,map最后也就十多个元素。
hashmap不是线程安全的
@第8感超人: 那用线程安全的。
Map m = Collections.synchronizedMap(new HashMap(...));
或
hashTable
@第8感超人: 楼主,这个方案有什么欠妥的地方么?
是怕map不断增大,无释放,消耗空间么?
用内部类的方式来做吧!
public class Singleton3 implements Serializable{ private Singleton3(){} private static class SingletonHolder{ private static Singleton3 instance = new Singleton3(); } public static Singleton3 getInstance(){ return SingletonHolder.instance; } //阻止生成新的实例 public Object readResolve(){ return SingletonHolder.instance; } }
这样的话,当这个单例被加载时,不会初始化单例类,只有当getInstance方法被调用的时候,才会去加载SingletonHolder,从而才会去初始化 instance。并且,单例的加载是在内部类的加载的时候完成的,所以天生对线程友好,而且也不需要synchnoized关键字,可以说是兼具了延迟加载和线程的优点。
1000多个参数怎么实现?