C# 哪些特性使类成为线程安全的?
在MSDN中,某些.NET类的描述如下: “此类型是线程安全的。” 或 “此类型的公共静态(在Visual Basic中共享)成员是线程安全的。不保证实例成员是线程安全的。”。 我的问题是,哪些特性使类成为线程安全的C# 哪些特性使类成为线程安全的?,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,在MSDN中,某些.NET类的描述如下: “此类型是线程安全的。” 或 “此类型的公共静态(在Visual Basic中共享)成员是线程安全的。不保证实例成员是线程安全的。”。 我的问题是,哪些特性使类成为线程安全的 螺纹安全编程是否有任何标准、建议或指南 当我使用lock(C#)关键字时,它意味着我的类是否是线程安全的 如何评估类的线程安全性?是否有任何测试来确保类是100%线程安全的 例如: public class MyClass { public void Method()
- 螺纹安全编程是否有任何标准、建议或指南
- 当我使用lock(C#)关键字时,它意味着我的类是否是线程安全的
- 如何评估类的线程安全性?是否有任何测试来确保类是100%线程安全的
public class MyClass
{
public void Method()
{
lock (this)
{
// Now, is my class 100% thread-safe like Microsoft classes?
}
}
type m_member1;
type m_member2;
}
感谢如果一个类的方法可以由多个线程同时调用,而不会损坏该类的状态或造成意外的副作用,那么该类通常被认为是线程安全的。类可能不是线程安全的原因有很多,尽管一些常见的原因是它包含一些在并发访问时会损坏的状态 有许多方法可以使类线程安全:
你还需要问自己,我需要让我的类线程安全吗?大多数UI框架的一个常见模型是只有一个UI线程。例如,在WinForms、WPF和Silverlight中,大部分代码将从UI线程执行,这意味着您不必将线程安全性构建到类中。首先,不要使用锁(this) 这可能导致死锁。因为其他代码可以从类的作用域之外锁定相同的对象。您应该创建一个本地对象,并将其用作类的锁 其次,线程安全是一个复杂的问题。网上有很多关于这个的资料
根据经验,所有的公共方法都应该被锁定并且线程安全,这样类才是线程安全的。如果一次只有一个线程可以修改从该类创建的对象的状态,或者该类提供了这样的功能,即多个线程可以同时调用该类的各种方法,则该类被认为是线程安全的。使用lock(C#)关键字,这意味着我的类是否是线程安全的? 当您使用lock时,这意味着锁
{}
中的代码部分是线程安全的。它不能保证你的类是线程安全的。正如Yochai Timmer所说,锁定(这个)
如何评估类的线程安全性?是否有任何测试来确保类是100%线程安全的?
我不确定是否有任何测试,因为在多线程中,您总是有可能偶然得到正确的结果。因此,为了确保类的代码是线程安全的,您可以查看类的代码,非常简单的解释如下:
线程安全类型意味着您在使用类型时不需要任何额外的同步机制。假设您可以创建一个实例,将引用传递给另一个线程(或多个线程),并使用两个线程中的方法/属性,而不需要额外的线程安全开销
是否有关于螺纹安全的标准、建议或指南
编程
最重要的标准是确保所有静态成员都是线程安全的。您将看到,所有编写良好的API(包括.NET基类库)都全面保证了这一点。这是一个很好的理由。由于静态成员是跨AppDomain共享的,因此许多不同的线程都可以使用它们,而您甚至没有意识到这一点。为每一个静态成员访问提供自己的同步充其量也会很尴尬。想象一下,如果Console.WriteLine
不是线程安全的,会是什么样子
就建议和指导原则而言,有很多行之有效的并发编程模式。现有的模式涵盖了各种各样的编程问题,并使用了许多不同的同步机制。生产者-消费者模式是许多众所周知的模式之一,它恰好解决了大部分并发编程问题
阅读。这是一个最好的和最审查的资源可用
当我使用lock(C#)关键字时,它意味着我的类是否是线程安全的
不!没有什么灵丹妙药可以使类线程安全。lock
关键字只是许多不同工具中的一个,这些工具可以使一个类对于多个线程同时访问是安全的。但是,仅仅使用锁
并不能保证任何事情正确使用同步机制可以使代码线程安全。错误使用这些机制的方法很多
如何评估类的线程安全性?有什么测试要做吗
确定一个类是100%线程安全的吗
这是一个百万美元的问题!测试多线程代码非常困难。Microsoft Research提供的工具是让并发程序员的生活更轻松的一种尝试。线程安全意味着当类的某个实例在多个线程之间共享时,没有两个线程可以同时更改该类的某个部分,从而导致数据损坏。
lock(此)
意味着它不是死锁安全的。你可能会发现Eric Lippert的这篇博文很有趣:简而言之,就是这样