c# - 线程安全和类方法参数

标签 c# multithreading

采用以下代码:

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

据我了解,由于 mutableParameter 在此方法之外是可变的,因此此代码不是线程安全的。

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

最佳答案

It is my understanding that this code is not thread-safe due to the fact that mutableParameter is changeable outside of this method.

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

What strategies do you employ in code (other than only using immutable classes or structs as parameters) to protect against this possibility?

如果可能,请完全避免该问题。不要一开始就在多个线程上读写同一个对象的同一个变量。

如果你无法避免,那就制作一个合适的可访问锁对象。

定义一个锁定协议(protocol),以便您 promise 在访问任何可以在另一个线程上访问的变量之前锁定对象。完成后解锁。

  • 确保订购锁以防止死锁。
  • 锁对象应尽可能不可访问。私有(private)比内部好,内部比公共(public)好很多。永远不要选择类型之类的东西作为锁定对象;您无法控制谁按什么顺序锁定它,因此您有可能出现死锁。
  • 确保每个每个 线程上的变量的访问都遵循该协议(protocol)。将 100 次访问中的 99 次锁定并让第 100 次不加锁进入是没有任何好处的。如果你不能阻止你无法控制的代码访问资源,那么资源本身需要被重写以使其成为线程安全的。
  • 衡量您的表现,看看锁被争用的频率。如果锁竞争激烈,请更改您的体系结构以防止争用。仅当您确实遇到了一个严重的问题,并且您无法通过任何其他方式改善时,您才应尝试无锁或低锁解决方案。

关于c# - 线程安全和类方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5810668/

相关文章:

c# - 如何将C#中匿名类型的IEnumerable序列化为JavaScript对象?

c# - Oracle 列/值大小问题

java - 忙自旋以减少上下文切换延迟(java)

c# - 我的抽象基础 MembershipProvider 在哪里?

c# - nuget-packing a csproj 与 nuspec 之间的区别

c# - 为什么在我的 Web API (ASP.NET v5) 项目中添加依赖项无法完全正常工作?

android - 当另一个线程中的语句失败时恢复 android 首选项的值

使用 WSHttpBinding 时 WCF 并发请求堆积在服务器上

Java多线程等待状态

c# - 当 backgroundWorker 停止工作时关闭表单