日期:2014-05-17  浏览次数:21075 次

高并发时应该用静态方法还是动态方法?
对于高并发的调用一个方法时,是把这个方法定义成静态好还是动态的好呢? 定义成静态的时候我用lock把这个方法锁住,这样只有一个调用完成了才会进行下一次调用,就不会出现死锁,动态方法每次调用都实例化一个对象,高并发的情况下会不会性能低下呢?
大家帮忙看看啊

------解决方案--------------------
通常我们设计为 public static的方法,是因为省事。跟性能无关。

如果你设计思路是面向对象的,你就可以new一个对象然后才调用其方法。如果没有必要面向对象,那么就可以设计为static方法。

比如说BLL方法,如果你的“引擎”系统需要先自动创建一个BLL实例对象,或者就好像asp.net一样先为每一个消息创建一个独立的Handler以提供用户定义执行方法的许多上下文环境数据,那么你就可以设计为所谓“动态”的就行了。

而如果你现在没有需求去考虑支持“装载不同的BLL对象实例”,并且你也考虑不到什么“上下文环境数据”之类的东西,你也可以从一开始就设计为static方法,引擎系统调用static的方法。

这里考虑的是设计。之所以考虑这些,是因为什么“性能”之类的显得并没有什么差别。真正的软件开发和运行的性能表现,需要整体测试最终效果,不是你死抠一两条代码能够发现的。
------解决方案--------------------
其实这是博客园那拨人的错误传教方式带来的问题

本身对于静态方法而言根本就不存在什么所谓的并发问题
理由很简单
1.对于方法,编译器是一视同仁滴,哪怕你是非静态方法,其编译后的代码,其实就是静态滴,代码就只有一份,不会因为你不是静态方法他就多出n份的道理

2.对于博客园那些不明就里的传教者来说,所谓的静态并发问题,其实多数发生在共享的资源上面,这些资源包括静态属性,文件占用,端口分配,数据库连接这些东西上,而非静态方法本身有问题

所以就其本身只是因为错误的使用导致的并发问题,而非博客园教条式的号称凡是静态都有并发问题。而解决这种并发问题其实也很简单
1.尽量不依赖外部提供,尽量遵守基础设计原则--迪米特法则
2.如果有必要使用共享外部资源请lock他