我需要根据变量或属性的值锁定一段代码。假设正在调用我的方法并传递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.其他应该自由移动。
我在想的是,而是创建一个新的锁定对象,为lock创建一个自定义类,其中包含User ID的属性。当请求到来时,我根据该特定值创建一个锁。我甚至不知道这是否可行。请指引我正确的方向。
答案 0 :(得分:0)
您当前锁定的方式根本不会做任何事情,因为调用该函数的两个线程将创建两个单独的锁定对象,但是您声明“假设我的方法被调用并传递UserData对象。 “而且每个UserData
对象都有Id
和Marks
如果确实如此,那么您需要做的就是锁定UserData
个对象。
public void UpdateMarks(UserData userData)
{
lock(userData)
{
//Do stuff to userData.Marks
}
}
唯一需要注意的是,如果你在代码中有进一步锁定,可能依赖于其他锁定对象,你可能会让你自己陷入僵局。