对于静态方法执行的有关问题,有一点比较疑惑,先多谢各位

对于静态方法执行的问题,有一点比较疑惑,先谢谢各位
asp.net 也就是大家理解的本身就是多线程的环境。
用户之间一定情况下互不干扰。

今天又突发想到一个问题,就是静态方法是否会有等待存在???

打个比方:
现在有个业务处理类调用了静态方法,比如类型转换

public bool CheckType()
{
    return util.Convert(parm1,param2);
}

class util
{
   static Convert(parm1,parm2)
   {}
}

OK,如果同一时刻A和B用户同时调用了CheckType ,这时是如何执行的?是互相不影响还是会有等待?
谢谢大家!


------解决思路----------------------
互不影响,对于这种情况微软一般用线程安全来描述,因为静态方法在执行上与非静态方法无差别,当然如果Convert方法内部有lock之类的逻辑那就不一样了,那就是多线程的问题了
------解决思路----------------------
不要光看方法的修饰符,要看你的方法具体过程,所以现在只能说不可确定。
因为在静态方法内如果存在对静态成员的操作,那么该方法会引起线程安全性问题。
------解决思路----------------------
排除一切会导致锁的情况,不会等待,就算会操作同一个static变量,只是结果很可能不是你想要的,甚至会出异常
------解决思路----------------------
不会有任何等待。

这其实是一个操作系统原理问题。你可能没有学习过这方面基础,我简单说一下。

windows操作系统实际上是基于线程来控制cpu执行上下文的,每当启动一个进程,其实就是启动了一个主线程,然后这个主线程可能再去启动其它子线程。于是,实际上所有的程序的具体执行过程都可以用线程(而不是进程)来说明。

在windows启动任何线程时,会产生一个“线程上下文”数据结构,包括cpu寄存器状态(其中就包括当前线程的代码执行的指针地址),以及一个至少1M大小的栈空间。平常它保存在内存中,当windows调度一个线程拥有cpu时间时就被windows加载。

当线程执行时要调用一个方法(不管是Main()还是别的什么方法),它自然是按照函数调用的规范,把参数压入栈,然后将代码执行地址指针修正到(跳转到)函数入口地址。从方法函数返回时则是做相反操作,并且额外弹出返回值。

当windows系统下同时执行多个线程时,windows要以抢先多任务方式来调度这些线程。例如在只有一个CPU的情况下,就是要把当前cpu信息(包括cpu执行到哪一个地址的指令的信息)装入线程的上下文,然后开始加载下一个线程的上下文信息,从而cpu的执行地址就切换到下一个线程的之前的“断点”继续执行了。注意桌面windows系统是“抢先多任务方式”的。

只有代码访问到需要引用“堆空间”的引用变量时,才有可能冲突(由于抢先多任务,因此并发线程可能以乱序来修改堆中的数据)。而线程的代码执行位置、方法函数参数、方法函数中声明的值类型变量值(这些都在运行时放到宿主线程的栈中)则是私有的,每一个线程都与另外一个线程是独立的,不存在数据的“等待”问题。

并且由于是“抢先多任务系统”的原因,不管线程愿意不愿意,windows系统每秒都会切换上百次线程上下文,不给线程什么“等待”时间。
------解决思路----------------------
不同的线程执行同一个简单的静态方法无需等待也没有冲突,
因为静态方法获取的数据是从堆栈取的,而堆栈是由线程带来的,每个线程都有自己的堆栈.