问题描述
第一种单实例publicstaticSingletonclass{staticinta;staticintb;staticSingleton{}}这是不是一种最简单的单实例,内存中只有一份??还是每线程一份?如果是每线程一份那static关键字的意义何在呢?我在xp的iis中测试过这种单实例,结果是每刷新一次,就调用一次Singleton的静态构造函数,很费解啊.假如这是一种单实例,个人认为这是首选使用的单实例,因为简单,容易使用----------------------------------------第二中单实例usingSystem; publicclassSingleton { privatestaticSingletoninstance; privateSingleton(){} publicstaticSingletonInstance { get { if(instance==null) instance=newSingleton(); returninstance; } } }这种方案在.Net下面是线程不安全的,每个线程进来会创建不同的类型实例。(引用别人的说明)static修饰的东西不是只有一个副本,都一直放在内存中吗,为什么每个线程进来会创建不同的类型实例?--------------------------------------------第三中单实例publicsealedclassSingleton { privatestaticreadonlySingletoninstance=newSingleton(); privateSingleton(){} publicstaticSingletonInstance { get { returninstance; } } }毫无疑问,这是一种线程安全的单实例,因为有readonly修饰----------------------------------------------publicclassSingletonProviderwhereT:new() { SingletonProvider(){} publicstaticTInstance { get{returnSingletonCreator.instance;} } classSingletonCreator { staticSingletonCreator(){} internalstaticreadonlyTinstance=newT(); } } publicsealedclassSingleton { privatestaticvolatileSingletoninstance; privatestaticobjectsyncRoot=newObject(); privateSingleton(){} publicstaticSingletonInstance { get { if(instance==null) { lock(syncRoot) { if(instance==null) instance=newSingleton(); } } returninstance; } } }这两种都是单实例,感觉象在脱裤子放屁,绕弯子-------------------------------------------个人认为static修饰的类就是单实例了static修饰的变量是线程不安全的,每个线程都可以任意修改变量的值,即static变量在内存中对所有线程是共享的因此static修饰的类虽然是线程不安全的,但对所有线程还是共享的,所以也是一种单实例可我在xp的iis中测试,每刷新一次static类的构造函数都要被调用一次,请各位支招,谢谢!我开发的一些组件类经常需要很多参数,每个组件有一个配置类,如果页面使用到组件需要传递配置类给组件,因此我想实例化好一些配置类在内存中,这样所有线程都共享这些配置类,多好啊,省得每次使用组件都得初始化
解决方案
解决方案二:
xp的iis真是烂东西,我在2003的iis中无论刷新或者重新打开网页多少次static修饰的类和变量始终就在内存中,不会重新创建妈的,回家就装2003,