以最简单的方法,做最复杂的测试

对于多线程同步避免Lock(String)的补充

上一篇 / 下一篇  2009-02-20 17:30:10 / 个人分类:.NET技术

最近由于测试需要,用.NET写了不少多线程同步的应用,期间的学习过程中经常看到很多同志提及,避免对string的lock,其主要的出发点是:

针对字符串,根据string的恒定性,.NET有个拘留池,用来提高性能。

公共语言运行库通过维护一个表来存放字符串,该表称为拘留池,它包含程序中以编程方式声明或创建的每个唯一的字符串的一个引用。因此,具有特定值的字符串的实例在系统中只有一个。
例如,如果将同一字符串分配给几个变量,运行库就会从拘留池中检索对该字符串的相同引用,并将它分配给各个变量。

由于这个原因,假如你lock的字符串对象在拘留池中(通常是编译时显式声明的用引号引起来的字符串),那么,这个对象也有可能被分配到另外一个变 量,如果这个变量也使用了lock,那么,两个lock语句表面上lock的不同对象,但实质上却是同一个对象,这将造成不必要的阻塞,甚至可能造成死 锁。且不亦发现问题。

其实,实际中还有一点非常重要的原因:

String有一个不可破坏的特性(immutable),或者简单叫做只读特性,这意味任何改变String的操作其实都没有改变原本那个String,而是创建了一个新的String实例同时让变量的引用(指针)指向了新String。哇靠,这个特性可NB啦,这就意味着即使string可以被看作引用类型被lock,但实际不可变更对象的值,否则lock就失效了!


TAG:

 

评分:0

我来说两句

日历

« 2024-05-14  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 10746
  • 日志数: 14
  • 建立时间: 2008-12-24
  • 更新时间: 2010-05-10

RSS订阅

Open Toolbar