我偶尔会遇到这个问题并忽略它,但今天它开始困扰我了。
private readonly object _syncRoot = new object();
private List<int> NonconcurrentObject { get; } = new List<int>();
public void Fiddle()
{
lock (_syncRoot)
{
// ...some code...
NonconcurrentObject.Add(1);
Iddle();
}
}
public void Twiddle()
{
lock (_syncRoot)
{
// ...some different code...
NonconcurrentObject.Add(2);
Iddle();
}
}
private void Iddle()
{
// NOT THREADSAFE! DO NOT CALL THIS WITHOUT LOCKING ON _syncRoot
// ......lots of code......
NonconcurrentObject.Add(3);
}
我有一个类的多个公共方法,其中某些代码本质上不是线程安全的(上面的List
是一个微不足道的例子)。 我想要使用辅助方法来处理它们之间共享的代码(任何人都会这样做),但在拆分共享代码时,我面临着一个困境:是否在辅助方法中使用递归锁定? 如果我这样做,我的代码就会浪费资源,可能表现较差。 如果我不这样做(如上所述),则辅助方法将不再具有线程安全性,并且如果将来由其他方法调用,则会存在严重的竞态条件。
我如何(优雅而强大地)表明方法不是线程安全的?
// ...一些代码...
,// ...一些不同的代码...
。这些都在受保护的区域内。 - Theodor Zoulias