日期:2014-05-18  浏览次数:20372 次

就剩100分全送了,问一个让我很困惑的线程问题
1 windows本身不就已经是多线程在工作吗?那就是说我们的asp.net网页程序,也默认是在多线程工作,既然这样,为什么还需要多线程编程提高效率?
2 一个asp.net动态网页程序,如果很多人在同时请求访问,那是不是可以这么理解,每个请求过来,系统都会增加一个主线程?然后主线程又开了N多个子线程去处理各种任务?
3 比如我们有一个类叫classa,然后我们创建这个类的实例,classa thisa = new classa();
执行这句话,服务器就是把一个类实例化并放入到一个内存中
  这时候我困惑的是,如果多个线程都在new这个实例的时候,那么他们之间是共享这个类实例,还是各自有各自的类实例?
  如果共享的话,就意味着同时new时会产生冲突,有可能请求出来n个出来,那么我们平时这么写
new classa(),就是存在风险的,必须先lock,但现在看很少有人考虑new 实例时去lock它,为什么?
  如果各自有各自的实例,那么岂不是占用很多的内存?而这些实例又是一样的,似乎windows也没有必要做

先问这几个问题,请达人给答疑解惑,谢谢了

------解决方案--------------------
问题一、Windows本身是多线程没错,默认也是多线程工作的。但自己编程时采用多线程提高效率跟Windows本身的线程不是一个概念。譬如,你在编程时要执行步骤1\2\3\4\5\6,这是按照顺序执行下来的,如果你用多线程操作,告诉系统创建6个线程,分别执行1-6的步骤,那么效率是不是提高了许多呢?
问题二、每个请求均会有相应的Session,每个Session都至少有一个线程;
问题二、每个线程都是会创建一个实例的,各自有各自的实例,占内存是肯定的,因为有可能每个页面实例的值是不一样的。另外,如果你声明的类是Static的,这时候就需要进行线程之间的同步操作;

问题其实很简单,不需要困惑的。
------解决方案--------------------
1 windows本身不就已经是多线程在工作吗?那就是说我们的asp.net网页程序,也默认是在多线程工作,既然这样,为什么还需要多线程编程提高效率? 

asp.net是多线程处理,但对于每个请求又是单线程在处理,多线程编程会提高效率,但是有适用场合,线程过多也会导致cpu太高,w3wp回收频繁,而且也要考虑线程的通信和同步问题,增加编程的难度和可控度

2 一个asp.net动态网页程序,如果很多人在同时请求访问,那是不是可以这么理解,每个请求过来,系统都会增加一个主线程?然后主线程又开了N多个子线程去处理各种任务? 

开一个主线程,但没有N个子线程处理,而是顺序处理

3 比如我们有一个类叫classa,然后我们创建这个类的实例,classa thisa = new classa(); 
执行这句话,服务器就是把一个类实例化并放入到一个内存中 
这时候我困惑的是,如果多个线程都在new这个实例的时候,那么他们之间是共享这个类实例,还是各自有各自的类实例? 
如果共享的话,就意味着同时new时会产生冲突,有可能请求出来n个出来,那么我们平时这么写 
new classa(),就是存在风险的,必须先lock,但现在看很少有人考虑new 实例时去lock它,为什么? 
如果各自有各自的实例,那么岂不是占用很多的内存?而这些实例又是一样的,似乎windows也没有必要做 

lock的情况,是必须考虑的,如果是new的动态的实例,那么每个请求都会有一个实例,所以不用考虑lock的情况,但对于静态的类的实例,静态的方法,因为共享这些实例和方法,就要lock了,内存的占用gc会根据优先级回收