ConcurrentDictionary Pitfall - Are delegates factories from GetOrAdd and AddOrUpdate synchronized?

前端 未结 2 1331
星月不相逢
星月不相逢 2020-12-02 17:02

The documentation of ConcurrentDictionary doesn\'t explicit state, so I guess we cannot expect that delegates valueFactory and u

2条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-02 17:55

    Yes, you are right, the user delegates are not synchronized by ConcurrentDictionary. If you need those synchronized it is your responsibility.

    The MSDN itself says:

    Also, although all methods of ConcurrentDictionary are thread-safe, not all methods are atomic, specifically GetOrAdd and AddOrUpdate. The user delegate that is passed to these methods is invoked outside of the dictionary's internal lock. (This is done to prevent unknown code from blocking all threads.)

    See "How to: Add and Remove Items from a ConcurrentDictionary

    This is because the ConcurrentDictionary has no idea what the delegate you provide will do or its performance, so if it attempted lock around them, it could really impact performance negatively and ruin the value of the ConcurrentDictionary.

    Thus, it is the user's responsibility to synchronize their delegate if that is necessary. The MSDN link above actually has a good example of the guarantees it does and does not make.

提交回复
热议问题