在C#上锁定以防止多个线程或事件使用相同的变量值

时间:2011-01-23 01:48:22

标签: c# locking

我想从sql中释放我的应用程序,因为我没有大型数据库。我想把我的数据保存在内存中,所以我的应用程序运行得更快。

我的问题是我有一个密钥池,只有4个客户端可以使用密钥,我想锁定每个密钥,当它注册到客户端时,我会使用:

lock(key)
{
  assignKeyToClient(clientId);
}

如果我使用它,会锁定使用密钥的副本还是锁定ram上的原始“密钥”并在完成分配后释放它?

谢谢!

2 个答案:

答案 0 :(得分:6)

我认为您对lock语句的含义感到困惑 - 它仅用于并发管理 - 它确保它所保护的代码部分(“关键部分”)仅由一个线程输入一段时间。

这与用户数据无关,即客户端ID或密钥。要管理唯一的客户端ID,您可以使用类似Dictionary的内容。当您指定密钥时,只有在执行此部分代码的多个线程时才应使用锁。如果是这种情况,请使用私有只读对象变量在类实例中锁定,以确保只分配一次相同的键:

private readonly object myLock = new object();
private Dictionary<int> assignedKeys = new Dictionary<int>();
...

lock(myLock)
{
  int key = PickAKeyHere();
  AssignKeyToClient(key, clientId);
  assignedKeys[key] = clientId; //keep track of which client is assigned what key 
}

答案 1 :(得分:3)

如果您没有大型数据库,那么所有数据库查询都应该是&lt; 1秒。您没有任何理由将所有数据都放在内存中。通过直接查询数据库或从内存中查询数据库的性能差异可以忽略不计。

你所做的一切都是让你的应用程序复杂化。过早优化是万恶之源。