The implementation of removeValue and removeAll uses self.concurrentQueue.async, which results in a different behavior vs. the regular dictionary. This means it's not a fully drop-in replacement.
If a caller removes a value and then that caller (or a caller of the caller) checks the dictionary, it may still contain the value (for an indeterminate amount of time).
May I ask why these calls must be async?
Thanks.