采用以下代码:
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/