1

我需要根据变量或属性的值锁定一段代码。假设正在调用我的方法并传递 UserData 对象。

UserData contains two properties 

UserID and Marks

而目前的锁码就像

var l=new Object();
lock(l)
{
//Update marks of a particualr user id to UserData.Marks
}

现在它将锁定此方法的所有内容,假设它正在更新 UserID=1 的标记,它仍会锁定其他用户 ID 的未来调用,我希望它锁定对正在访问的特定用户 ID 的请求锁定,在这种情况下用户 1. 其他应自由移动。

我的想法是创建一个新的锁定对象,创建一个包含用户 ID 属性的锁定自定义类。当请求到来时,我会根据该特定值创建一个锁。我什至不知道这是否可能。请引导我正确的方向。

4

1 回答 1

1

您当前锁定的方式根本不会做任何事情,因为调用该函数的两个线程将创建两个单独的锁定对象,但是您说“假设我的方法正在被调用并传递 UserData 对象。 ”并且每个UserData对象只有两个Id和的属性Marks

如果这是真的,您需要做的就是锁定该UserData对象。

public void UpdateMarks(UserData userData)
{
    lock(userData)
    {
         //Do stuff to userData.Marks
    }
}

唯一需要注意的是,如果您在该代码中有更多的锁,这些锁可能依赖于其他锁对象,您可能会陷入死锁状态。

于 2013-09-22T18:19:38.040 回答