[已解决问题] 关于静态方法的疑问
提问时间: 2008-03-17 10:52
悬赏分:30 浏览:481 次

Web开发的后台方法如果用了静态方法是不是就无法实现并发了。
是不是  CustomerDA.FindCustomerByID(xxxx); 这样的方法同一个时间只有一个调用 而 new CustomerDA().FindCustomerByID(xxxx); 这样的方法就可以有并发调用啊。

不太清楚静态方法和非静态方法的机制的区别。 有我种疑问的人多吗?


最佳答案
能否安全并发,只需要看不同的运行实例(线程)里是否要读写同一个变量.

只要你的CustomerDA.FindCustomerByID(xxxx)里不使用静态成员字段(或者对静态字段做只读访问),就没有问题.

即使一定要写入会在其它线程里访问的字段,只要用好lock,也是一样的.总而言之,并发安全与否,与方法是静态与否,完全无关.
2008/3/17 12:32:18 回答者:deerchao


提问者对于答案的评价:静态方法的确是可以并发调用的。 我一直有个错误的认识,任务静态方法的一个调用没有执行完成另外一个调用是不能执行的。
其它回答(2)
静态方法当然是可以并发调用啦!
4个月前   回答者:阿不 - 小虾三级
静态方法和实例方法的唯一区别就是在方法体中能否使用this。与并发访问没有任何关系。

但是,我们经常在MSDN中发现这样的说法:
---------------------------
此类型的任何公共 static(在 Visual Basic中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。
---------------------------

这一条,其实是微软为他们提供的类库所提供的一个保证,也就是说,微软承诺这些方法可以安全的多线程使用。并不表示线程安全和静态方法有任何关系。如果我们要在自己的类库中暴露静态方法,也应该给用户与类似承诺。

大多数时候,静态方法并不会造成线程安全的问题。问题往往出现在静态字段上。对于这些字段的读写,应该尽量暴露相应的方法或属性,内部进行Lock,以确保给予用户上面的承诺。

关于静态字段的线程安全,可以参考一篇我以前的Blog:
http://www.cnblogs.com/Cajon/archive/2007/03/21/Multi_Thread_Win_Form.html
4个月前   回答者:Colin Han - 老鸟四级
评论
   您需要登录以后才能回答!
我的问题    我要提问


快到期问题

> 问题排行榜

有不合适内容,建议去除