当前位置: 首页 > 编程语言 > C#

msdn:什么是“线程安全”?分享

时间:2023-04-10 14:55:15 C#

msdn:什么是“线程安全”?在大部分MSDN文档中,它都写在线程安全标题下;“此类型的任何公共静态(在VisualBasic中共享)成员都是线程安全的。没有任何实例成员保证是线程安全的。”例如;这里的任何人都可以用一种相当简单的方式解释它吗?谢谢:)EricLippert有一篇关于此的很棒的博客文章。基本上它本身是没有意义的。就个人而言,当我看到样板时,我在这方面不太信任MSDN。它并不总是意味着它所说的。例如,它对编码说了同样的话——尽管我们都使用来自多个线程的编码。除非我有任何理由不这样做(我使用编码),否则我认为我可以在不破坏全局状态的情况下从任何线程调用任何静态成员。如果我想使用来自不同线程的同一对象的实例成员,我认为如果我确保——通过锁定——一次只有一个线程将使用该对象,那很好。(当然不总是这样。一些对象具有线程亲和性并且主动不喜欢从多个线程使用,即使锁定到位也是如此。UI控件就是一个明显的例子。)当然,如果对象是非显而易见地共享-如果我有两个对象,每个对象都共享对第三个对象的引用,那么我可能最终会独立于不同的线程使用前两个对象,所有对象都正确锁定-但最终仍然会破坏第三个对象。如果一个类型确实宣称自己是线程安全的,我希望它能提供一些关于它的细节。如果它是不可变的,那就很容易了——你可以只使用你喜欢的实例而不用担心它们。它是部分或完全“线程安全”类型,在细节重要的地方可变。您可以从多个线程同时访问该类的任何公共静态成员,而不会中断该类的状态。如果多个线程同时尝试使用实例方法(未标记为“静态”的方法)访问该对象,则该对象可能会损坏。如果尝试从多个线程同时访问该类的同一个实例不会导致问题,则该类是“线程安全的”。“线程安全”对象意味着如果两个线程同时(或非常接近,在单CPU系统上)使用它,那么它不会被所述访问破坏。这通常是通过获取和释放可能导致瓶颈的锁来实现的,因此“线程安全”也可以意味着“慢”,如果不需要的话。很多人希望公共静态成员在线程之间共享(注意,VB甚至称之为“共享”),因此公共静态通常以使用安全的方式完成。实例成员通常不是线程安全的,因为它在一般情况下会减慢速度。所以如果你有一个你想在线程之间共享的对象,你需要做你自己的同步/锁定。要理解这一点,请考虑以下示例。在.net类HashSet的MSDN描述中,有一节说明线程安全。对于HashSet类,MSDN表示“此类型的任何公共静态(在VisualBasic中共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。”因为我们都知道竞争条件和死锁概念,但微软试图用简单的英语表达什么?如果两个线程将两个值添加到HashSet的一个“实例”中,有些情况下我们可以将其算作一个。原因是在这种情况下HashSet对象已损坏,因为我们现在在HashSet中有两个对象,但它的计数只显示一个。然而,HashSet的公共静态版本即使两个线程同时添加值也不会面临这种损坏。以上是C#学习教程:msdn:Whatis"threadsafety"?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: