HY,
众所周知,开发多线程应用程序是一件困难的事情。特别是当何时和什么锁定点不是那么明显恕我直言。我经常看一个方法/类,我必须问自己,如果我共享一些数据,可以通过多个线程修改。当我不确定它是否在整个代码块中的lock()结束时。
所以我想知道:您是否有关于模式/规则等的建议来识别共享数据?或者确保代码是线程安全的技术。
E.g:
顺便说一下:
Microsoft Research正致力于CHESS。在并发程序中查找和复制Heisenbugs的工具。我希望这和PLINQ能够改进并发程序的开发。
答案 0 :(得分:3)
尽可能使您的类型不可变。然后就没有必要克隆了。如果您需要“更改”对象的内容,请使该方法返回一个新对象 - 就像String.Replace
等一样。
这基本上是函数编程风格,它很可爱。遗憾的是,我们(目前)没有内置于.NET框架中的不可变集合,而第三方集合也是including one by our own JaredPar。
答案 1 :(得分:0)
在使线程安全时,将数据封装在类中非常有用。您可以控制数据的访问方式,并且可以让类负责同步,而不是让整个应用程序的代码都尝试正确同步。
此外,您可以在某处放置一个可用作锁定标识符的私有变量,以便您可以避免将数据本身用作锁定的标识符。通过将专用变量专用作锁定标识符,可以删除一个可能的死锁源。