当前位置:首页 > C#高效编程话题集
1:在方法内,方法参数和局部变量,赋值为null无助于加速被垃圾回收器标识为垃圾;
2:实例变量,随着实例=null,实例变量也会自动=null。所以,一般情况下,无需显式为实例变量=null,除非你的实例生存周期较长,并且实例变量是个大对象;
3:静态变量,如果不显式置为null,就永远不会被回收; 27:不建议lock(this)
1:如果两个对象的实例分别执行了lock(this)这样的代码,实际锁定的是两个对象,完全不能达到同步的目的。
2:最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。
28:区分计算密集型和I/O密集型的多线程应用场景
I/O密集型操作。硬盘、网卡、声卡、显卡等都是。CLR所提供的异步编程模型就是让我们充分利用硬件的DMA功能来提高CPU的利用率。
一个在大多数情况下正确的技巧是,凡是FCL中类型提供了类似BeginDoSomething方法的,都建议使用这个异步调用来完成多线程编码,异步在后台调用线程池线程完成调度,最大化的节约了系统的性能。
29:使用Parallel的一个陷阱 以下的代码的输出是什么?
int[] nums = new int[] { 1, 2, 3, 4 }; long total = 0;
Parallel.For
实际上,它有可能是11,较少的情况下会是12,几乎不可能出现13,14。
要从方法的最后一个参数Action
少个线程,如果是1个,自然就是11,如果是2,结果自然就是12了,依此类推。之所以不可能为14,是因为,并发的循环体就只有4个循环,并发显然不会傻到新起4个线程来执行并发。
10:不建议lock(类型的type)
由于typeof(SampleClass),是SampleClass的所有实例所共有的,这会导致当前应用程序中的所有SampleClass的实例的线程,将会全部被同步。
共分享92篇相关文档