C# msdn:什么是;螺纹安全“;?

C# msdn:什么是;螺纹安全“;?,c#,.net,thread-safety,C#,.net,Thread Safety,在许多MSDN文档中,这是在线程安全标题下编写的 “此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。” 比如, 有人能简单地解释一下吗? 谢谢:)您可以同时从多个线程访问该类的任何公共静态成员,而不会中断该类的状态。如果多个线程同时尝试使用实例方法(那些未标记为“静态”的方法)访问对象,则对象可能会损坏 如果试图同时从多个线程访问类的同一实例不会导致问题,则类是“线程安全的”。对象是“线程安全的”,意味着如果两个线程同时(或非常接近,

在许多MSDN文档中,这是在线程安全标题下编写的

“此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。”

比如,

有人能简单地解释一下吗?
谢谢:)

您可以同时从多个线程访问该类的任何公共静态成员,而不会中断该类的状态。如果多个线程同时尝试使用实例方法(那些未标记为“静态”的方法)访问对象,则对象可能会损坏

如果试图同时从多个线程访问类的同一实例不会导致问题,则类是“线程安全的”。

对象是“线程安全的”,意味着如果两个线程同时(或非常接近,在单CPU系统上)使用它,它不可能被上述访问破坏。这通常是通过获取和释放锁来实现的,锁可能会导致瓶颈,因此“线程安全”也可能意味着在不需要的时候执行“慢”

公共静态成员在线程之间共享(注意,VB甚至称之为“共享”),因此公共静态通常是以安全使用的方式进行的


实例成员通常不是线程安全的,因为在一般情况下,它会减慢速度。因此,如果有一个对象要在线程之间共享,则需要自己进行同步/锁定。

Eric Lippert对此有很好的理解。基本上,它本身就没有什么意义

我个人不太相信MSDN在这方面,当我看到锅炉板。它并不总是意味着它所说的。例如,关于
编码
,它说了同样的事情——尽管事实上我们都使用来自各地多个线程的编码

除非我有任何理由相信(我使用
编码
),否则我假设我可以从任何线程调用任何静态成员,而不会损坏全局状态。如果我想使用来自不同线程的同一对象的实例成员,我假设如果我通过锁定确保一次只有一个线程使用该对象,这是可以的。(当然,情况并非总是如此。有些对象具有线程亲和力,即使锁定到位,也不喜欢从多个线程使用。UI控件就是明显的例子。)

当然,如果对象被不明显地共享,这会变得很棘手——如果我有两个对象,每个对象都共享一个对第三个对象的引用,那么我最终可能会独立于不同的线程使用前两个对象,并使用所有正确的锁定——但仍然会损坏第三个对象


如果一个类型确实宣传自己是线程安全的,我希望它能提供一些关于它的细节。如果它是不可变的,那么这很容易——您可以随意使用实例,而不用担心它们。它是部分或完全“线程安全”的类型,在细节非常重要的情况下是可变的。 在.net类HashSet的MSDN描述中,有一部分是关于线程安全的。在HashSet类中,MSDN表示“此类型的任何公共静态(在visualbasic中共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。” 当然,我们都知道竞争条件和僵局的概念,但是微软想用简单的英语说什么呢?
如果两个线程向哈希集的“实例”添加两个值,那么在某些情况下,我们可以将其计数为一。当然,在这种情况下,HashSet对象已损坏,因为现在HashSet中有两个对象,但其计数仅显示一个。然而,即使两个线程同时添加值,HashSet的公共静态版本也永远不会面临这样的损坏

MS的小注释的意思是,“我们在实例方法中没有做太多/任何锁定[可能是出于性能原因]。因此,如果你在它上插入了十几个线程,而它搞砸了,不要向我们哭诉。这不是一个bug。我们警告过你。”@赵:多线程的正确性远不止是锁定实例方法。您通常希望使一系列方法调用以原子方式工作—在这种情况下,再多的内部锁定也无济于事。迭代一个集合就是一个明显的例子。@Jon:同意,还有很多。但是对于MS来说,没有什么可以期待的了,因为跨多个方法调用的内置原子性对于任何重视稳定性的人来说都没有意义。(它需要API文档说明“如果调用IsEmpty(),并且返回false,则必须调用Remove()或ReleaseLock()以避免死锁”。)即使在单个方法中,如果不必要地使用它,也可能导致性能问题。所以她没有费心。这就是我的观点。@cHao:我同意MS没有试图这么做是正确的——我反对这种想法,认为这与“打扰”有关。您的第一条评论暗示锁定实例方法通常就足够了,对此我有异议。就这些。@Jon:锁定不是一切,甚至不是很近。但是如果没有它,或者像compare和swap这样的硬件级原子指令(这与非常短期的锁几乎是一样的),多线程就不能正确地完成。因此,当我想到“线程安全”时,锁定立即浮现在我的脑海中。在让事情正常运转方面,它确实走了相当长的一段路。