作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我最近在一个类似于下面的测试中遇到了一个面试问题,我没有太多使用线程开发的经验,有人可以帮助我告诉我如何处理这个问题吗?:
public class StringQueue
{
private object _lockObject = new object();
private List<string> _items = new List<string>();
public bool IsEmpty()
{
lock (_lockObject)
return _items.Count == 0;
}
public void Enqueue(string item)
{
lock (_lockObject)
_items.Add(item);
}
public string Dequeue()
{
lock (_lockObject)
{
string result = _items[0];
_items.RemoveAt(0);
return result;
}
}
}
对于上述实现,以下方法线程安全吗?为什么?
public string DequeueOrNull()
{
if (IsEmpty())
return null;
return Dequeue();
}
最佳答案
在我看来答案是否定的。
当 isEmpty() 过程锁定对象时,它会在调用返回后立即释放 -一个不同的线程可能会在调用 IsEmpty() 和 Dequeue() 之间调用 DequeueOrNull()(此时对象被解锁),从而删除唯一存在的项目,使 Dequeue() 当时无效。
一个看似合理的解决方法是在 DequeueOrNull() 中的两个语句上加锁,因此没有其他线程可以在检查之后但在 DeQueue() 之前调用 DeQueue()。
关于c# - 线程测试题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6617948/
我是一名优秀的程序员,十分优秀!