线程安全和类方法参数

时间:2011-04-27 21:13:37

标签: c# multithreading

请使用以下代码:

 public void SomeMethodWithParameters(MutableObject mutableParameter, String stringParameter, double structParameter)
    {
       // some code
    }

据我所知,由于mutableParameter在此方法之外是可更改的,因此该代码不是线程安全的。

您在代码中使用了哪些策略(除了仅使用不可变类或结构作为参数)以防止这种可能性?是否所有传递给该方法的对象实际上都是深度克隆?

1 个答案:

答案 0 :(得分:9)

  

据我所知,由于mutableParameter在此方法之外是可更改的,因此该代码不是线程安全的。

澄清:变量“mutableParameter”的内容不会改变;该变量将在其整个生命周期中引用相同的实例(前提是您不在方法中更改它)。如果某个引用同一对象的其他线程正在改变它们,那么被引用的实例所拥有的变量的内容可能会发生变化。

  

您在代码中使用了哪些策略(除了仅使用不可变类或结构作为参数)以防止这种可能性?

如果可能,请完全避免此问题。首先,不要在多个线程上读取和写入同一对象的相同变量。

如果你无法避免它,那么制作一个适当的访问锁定对象。

定义一个锁定协议,以便在访问可以在另一个线程上访问的任何变量之前保证锁定该对象。完成后解锁它。

  • 请务必订购锁以防止死锁。
  • 锁定对象应尽可能无法访问。私人比内部更好,内部更好,比公共更好。永远不要选择像锁物一样的东西;你无法控制谁以什么顺序锁定它,因此你有潜在的死锁。
  • 确保每个每个线程上的变量的访问都遵循协议。锁定100次访问中的99次并且在没有锁定的情况下让第100次进入是没有任何好处的。如果您无法阻止您无法控制访问资源的代码,那么需要重写资源本身以使其成为线程安全的。
  • 衡量您的表现并查看锁定的频率。如果锁定存在争议,请更改您的体系结构以防止争用。只有你绝对肯定有一个严重的问题,如果你试图采用无锁或低锁解决方案,你就无法以其他方式做得更好。