我想用这个简单的代码记录多线程中的冲突
DiGraph
这是一种适合在“碰撞”列表中添加元素的方法
public T DataRef
{
get
{
Collisions.DetectAndSaveCollision(typeof(T).ToString(), Sync);
lock (Sync)
{
return _tData;
}
}
set
{
IsInitialized = true;
Collisions.DetectAndSaveCollision(typeof(T).ToString(), Sync);
lock (Sync)
{
_tData = value;
}
}
}
但是我不确定它没有死锁
答案 0 :(得分:1)
这是无死锁的,因为最多可以同时进行一次锁。
正如Lasse在评论中指出的,这里存在竞争条件,因为您连续两次获得了6.4.7
锁。因此数据将不准确。如果近似数据足以满足您的需求,那么就可以了。
您可以通过不立即获得锁定来解决比赛。像这样:
Sync
这当然需要用var acquiredImmediately = Monitor.TryEnter(...); //test lock
if (!acquiredImmediately) {
Log(...);
Monitor.Enter(...); //retry by blocking
}
CriticalRegion();
Monitor.Exit();
保护。