我在访问共享变量的多线程环境中有一些代码。显然我需要lock
这些访问,但我的问题是我是否通过在短时间内锁定变量以获取值、解锁、用我检索到的内容做一些事情、然后重新锁定来修改来节省或创建额外的开销我刚刚解锁的数据结构。
显然,对于可以在锁之外完成的非常昂贵的操作,您将受益于不锁定该段。例如,以下情况如何,其中正在执行的操作相对便宜(创建 anew object
和 an if statement
):
少线程:
Value v;
lock (values)
{
v = values.FirstOrDefault(a => a.Thing == someValue);
if (v == null)
{
v = new Value { Thing = someValue };
values.Add(v);
}
}
更多线程:
Value v;
lock (values)
{
v = values.FirstOrDefault(a => a.Thing == someValue);
}
if (v == null)
{
v = new Value { Thing = someValue };
lock(values)
{
values.Add(v);
}
}
两种解决方案都是线程安全的,并且都非常易读(恕我直言),但是如果两者之间存在细微差别,那么将两者中更有效的一种融入我的习惯会很好。