msdn:什么是"线程安全"?

Bas*_*wer 10 .net c# thread-safety

在许多MSDN文档中,这是在Thread Safety标题下编写的;

"此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的.任何实例成员都不保证是线程安全的."

例如; 这里

有人可以用一种相当简单的方式解释它吗?谢谢 :)

Jon*_*eet 12

Eric Lippert有一篇关于此的精彩博文.基本上它本身有点无意义.

就个人而言,当我看到锅炉板时,我在这方面并不太信任MSDN.它并不总是意味着它所说的.例如,它说同样的事情Encoding- 尽管我们都使用来自多个线程的编码.

除非我有任何理由不相信(我这样做Encoding),我认为我可以从任何线程调用任何静态成员而不会破坏全局状态.如果我想使用来自不同线程的同一对象的实例成员,我认为如果我确保 - 通过锁定 - 一次只有一个线程将使用该对象,那就没关系.(当然并非总是这样.有些对象具有线程关联性,并且主动不喜欢从多个线程使用,即使锁定到位.UI控件就是明显的例子.)

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

如果一个类型确实宣传自己是线程安全的,我希望它能给出一些关于它的细节.如果它是不可变的那么很容易 - 你可以只使用你喜欢的实例而不用担心它们.它是部分或全部"线程安全"类型,在细节非常重要的情况下是可变的.

  • MS的小注释意味着,"我们没有在实例方法中做太多/任何锁定[可能出于性能原因].所以如果你去它上面打了十几个线程,它就会搞乱,不要来哭对我们来说.这不是一个错误.我们警告过你." (4认同)

Mic*_*tta 5

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

如果尝试同时从多个线程访问该类的同一实例不会导致问题,则该类是"线程安全的" .