在读取全局字符串之前锁定?

Joe*_*ool 1 .net c# multithreading

我有课而不是让背景工作者做一些处理器密集型的东西.后台工作者读取一些全局声明的字符串...我是否需要锁定这些字符串?backgroundworker从不编写字符串,它们只是表示在类的构造函数中设置的一些目录位置,并且几乎不会在构造函数之后由类写入(并且永远不会被后台工作者写入).所以这是可能的后台工作能读,因为它也正在由主类对象写入,但不可思议的事的字符串.但是,这些操作(后台工作者的读取和主类的写入)对于字符串文字都不是原子的吗?

谢谢,-Robert

编辑:我不关心字符串是否过时或任何事情(这在我的应用程序中不会是一个大问题),我更担心的是"对象在其他地方使用"异常.

Joe*_*oey 8

.NET中的字符串是不可变的; 他们无法改变.会发生的是,引用将指向完全不同的字符串,但字符串本身不会更改.

因此,如果您不特别注意后台工作者可能不会使用相同的字符串,如果您更改它,那么您应该没问题.示例:Worker A读取字符串,其他东西更改它,Worker B读取新字符串 - 也许这不会导致问题,也许它会导致问题.但访问字符串本身绝对是安全的.

引用文档:

这种类型是线程安全的.

ETA:Martinho Fernandes在下面的评论中提出了一个非常好的观点:线程安全的对象不能自动地表示你用它们做的一切都是线程安全的.他甚至写了一篇关于那篇文章的博文,这使我不得不再次说出他所做的一切:-)

  • 这段代码不是线程安全的:`aString [aString.Length-1]`.因为字符串是不可变的,所以它并不意味着对它们的引用也是不可变的. (3认同)
  • 无耻的插件:http://devnonsense.blogspot.com/2009/11/immutable-data-is-thread-safe.html (2认同)