首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“不可变的字符串是线程安全”是什么意思?

“不可变的字符串是线程安全”是什么意思?
EN

Stack Overflow用户
提问于 2013-09-30 00:22:14
回答 2查看 1K关注 0票数 5

我最近开始阅读C#中的可变和不可变对象,我发现无论在哪里我都会发现,不可变使得在用作哈希表中的键时线程安全和有用,但我不理解的是,就概念而言,虽然我们不能更改内容,但我们可以更改引用,即:

代码语言:javascript
复制
string s = "Hi";
s = "Bye";

虽然这里s的引用被更改为"Bye“,但主要是s的内容(或者更确切地说,它所指向的内容)已经更改,从编程的角度来看,这是相同的,那么如果字符串更改,这如何使特定函数threadsafe或在哈希表中可用?

EN

回答 2

Stack Overflow用户

发布于 2013-09-30 00:53:48

很简单。如果要将s传递给在不同线程上运行的代码,则此代码将在传递参数时接收s指向的字符串。就像.net中的所有字符串一样,它不会随着时间的推移而改变,因此您的线程化代码不需要考虑您可能会将s重新赋值给不同的值。

如果您将"Bye“赋值给s,则原始字符串将继续存在(直到其被垃圾回收为止),并且您的变量s将指向一个新字符串。

在字典中,这一点略有不同。如果您更改可变键的方式导致其哈希码发生变化,则字典将无法找到该键:哈希码用于在索引中进行搜索,并且如果哈希码随时间变化,字典将找不到正确的记录。因此,这并不是真的需要不变性,但不变性将确保哈希代码的计算一致性。

不变性为您做的是,它提供了将对象视为值类型(如int)的能力,这通常更容易推理。

票数 2
EN

Stack Overflow用户

发布于 2013-09-30 00:46:56

在您的示例中,s被重新分配为引用不同的string对象("Bye"),但s先前引用的对象("Hi")没有更改。引用字符串"Hi“的任何其他内容(另一个线程、Dictionary等)都不会受到影响。正如您所提到的,string是不可变的-它的内容一旦创建就不能更改。例如,如果您将一个string附加到另一个对象,则会得到一个新的string对象。两个原始string对象保持不变。这就是为什么string是线程安全的,并且适合在哈希表中使用。

引用s不是线程安全的-为了在使用引用时确保线程安全,您需要在引用赋值周围设置一个锁,以确保一个线程在另一个线程写入引用时不会尝试从引用中读取数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19080341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档