gpt4 book ai didi

c# - 使用 C# 示例锁定使类线程安全,或者此类线程安全吗?

转载 作者:太空狗 更新时间:2023-10-29 23:57:33 25 4
gpt4 key购买 nike

我正在尝试研究锁定以创建线程安全类并有几个问题。给定以下类(class):

    public class StringMe 
{
protected ArrayList _stringArrayList = new ArrayList();
static readonly object _locker = new object();

public void AddString(string stringToAdd)
{
lock (_locker) _stringArrayList.Add(stringToAdd);
}

public override string ToString()
{
lock (_locker)
{
return string.Join(",",string[])_stringArrayList.ToArray(Type.GetType("System.String")));
}
}
}

1) 我是否成功地使 AddString 和 ToString 成为线程安全的?

2) 在我创建的 ToString 方法中是否有必要锁定那里以使其线程安全?

3) 是只有修改数据的方法需要加锁,还是读写操作都需要加锁才能保证线程安全?

非常感谢您的宝贵时间!

最佳答案

不,您还没有使这些调用成为线程安全的 - 因为 _stringArrayList场受到保护。 AddString 时子类可以随心所欲地使用它和 ToString正在被调用。

例如(因为其他答案声称您的代码线程安全的。)

public class BadStringMe : StringMe
{
public void FurtleWithList()
{
while (true)
{
_stringArrayList.Add("Eek!");
_stringArrayList.Clear();
}
}
}

然后:

BadStringMe bad = new BadStringMe();
new Thread(bad.FurtleWithList).Start();
bad.AddString("This isn't thread-safe");

首选私有(private)字段 - 它可以更轻松地推理您的代码。

另外:

  • 首选 List<T>ArrayList这些天
  • 出于某种原因,您使用static 变量锁定...所以即使您有多个StringMe 实例。 , 只有一个线程可以在 AddString 中一次总共
  • 使用 typeof(string)Type.GetType("System.String")干净多了

3) Is it only the methods that modify data that need to be locked or do both the read and write opperations need to be locked to make it threadsafe?

全部,假设可能有一些操作。如果 everything 只是读取,则您不需要任何锁 - 但否则您的读取线程可以从数据结构中读取两位数据,这些数据在两者之间被修改,即使只有一个 线程。 (还需要牢记内存模型注意事项。)

关于c# - 使用 C# 示例锁定使类线程安全,或者此类线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8928045/

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