gpt4 book ai didi

c# - 字符串属性本身是线程安全的吗?

转载 作者:IT王子 更新时间:2023-10-29 04:10:42 27 4
gpt4 key购买 nike

C# 中的字符串是不可变的和线程安全的。但是当你有一个 public getter 属性时怎么办?像这样:

public String SampleProperty{
get;
private set;
}

如果我们有两个线程,第一个线程“同时”调用“get”,第二个线程“同时”调用“set”,会发生什么?

恕我直言,集合必须像这样锁定线程安全:

private string sampleField;
private object threadSafer = new object();

public String SampleProperty{
get{ return this.sampleField; }
private set{
lock(threadSafer){
sampleField = value;
}
}
}

最佳答案

大多数答案都使用“原子”一词,就好像只需要原子更改一样。他们通常不是。

这已在评论中提及,但通常不会在答案中提及 - 这是我提供此答案的唯一原因。 (关于以较粗的粒度进行锁定以允许诸如附加之类的事情的观点也完全有效。)

通常您希望读取线程查看变量/属性的最新 值。那isn't guaranteed by atomicity .举个简单的例子,这是停止线程的方法:

class BackgroundTaskDemo
{
private bool stopping = false;

static void Main()
{
BackgroundTaskDemo demo = new BackgroundTaskDemo();
new Thread(demo.DoWork).Start();
Thread.Sleep(5000);
demo.stopping = true;
}

static void DoWork()
{
while (!stopping)
{
// Do something here
}
}
}

DoWork 可能永远循环下去,尽管对 bool 变量的写入是原子的——没有什么可以阻止 JIT 在 DoWork 中缓存 stopping 的值。要解决此问题,您需要锁定、使变量 volatile 或使用显式内存屏障。这也适用于字符串属性。

关于c# - 字符串属性本身是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/434890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com