基于ID字段的并发对象锁

Tot*_*oto 8 c# locking

我有一个生产者/消费者流程.消费对象具有ID属性(类型为整数),我想一次只消耗一个具有相同ID的对象.我怎么能这样做?

也许我可以做这样的事情,但我不喜欢它(创造了太多的对象,而每天只有一两个具有相同ID的消息可以被消耗而且锁(_lockers)有点耗费时间:

    private readonly Dictionary<int,object> _lockers = new Dictionary<int,object>();
    private object GetLocker(int id)
    {
        lock(_lockers)
        {
            if(!_lockers.ContainsKey(id))
                _lockers.Add(id,new object());
            return _lockers[id];
        }
    }



    private void Consume(T notif)
    {
            lock(GetLocker(notif.ID))
           {
            ...
           }
    }

enter code here
Run Code Online (Sandbox Code Playgroud)

注意:同样的问题,ID属性是string类型(在那个cas中我可以锁定string.Internal(currentObject.ID)

Dam*_*ver 12

如注释中所示,一种方法是使用固定的锁池(比如32),并采用ID模32来确定要采用的锁.这会导致一些错误的锁共享.32是从空中挑选的数字 - 这将取决于您的ID值分布,消费者数量等.

  • -1,来吧,这只会减少一个因素的线程概率,并不能解决它. (3认同)