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

解决方案 »

  1.   

    如楼上大哥所说,windows本身是在多线程工作,但我们做程序,却都做成单线程的了?这似乎有点不可能把,也许是framework封装了,但单线程我觉得不大可能,大家多讨论讨论把
      

  2.   

    可以确定一点 如果多个线程都new一个对象的话 这些对象肯定是不同的 而不是共有的
      

  3.   

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

  4.   

    对你的第一个和第二个问题 
    我的简单理解啊
    "系统都会增加一个主线程"-->"默认是在多线程工作"
    "N多个子线程去处理各种任务"-->"多线程编程提高效率"
    请高人指点
      

  5.   

    而且针对asp.net的多个请求 好像是iis里面的工作机制 而和操作系统的多线程不是一回事情
      

  6.   

    wisest 说的,我似乎有点明白了,呵呵,谢谢
    不过还是不明白,自己编程时采用多线程提高效率跟Windows本身的线程不是一个概念,是什么意思?
    我们的说的线程和windows的线程难道不是一个东西?
      

  7.   

    Windows本身的线程是为了维护或保证线程运行的正常;而自己编程所采用的线程是告诉系统需要做多少事情,该怎么做;线程当然是一个东西,都是CPU的分时。
      

  8.   

    多线程感觉就像向CPU多要时间片来执行程序
      

  9.   

    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会根据优先级回收
      

  10.   

    C#是自动垃圾回收的,
    当new Class时,创建时,产生一个线程,作为我设计人员不必考虑这些线程,就象一个闹钟,我们不必考虑内部的齿轮相互间如何运转的,我只要知道,如何设置闹钟就行了
    所以,我们不考虑内存问题,内存问题在ASP。net有一个GC的类是可以处理和查看的