Concurrent maps are used for thread-safety, but the use of such maps alone does not ensure thread-safety; they must also be _used_ in a thread-safe manner. Specifically, retrieving a key's value from a map, and then using ``++put++`` to add a map element if the value is ``++null++`` is not performed in an atomic manner. Here's what can happen
----
Thread1 cmap.get("key") => null
Thread2 cmap.get("key") => null
Thread1 cmap.put("key", new Value())
Thread2 cmap.put("key", new Value())
----
Note that this example is written as though the threads take turns performing operations, but that's not necessarily the case.
Instead of ``++put++``, ``++putIfAbsent++`` should be used.
\[~nicolas.peru] note that in the code sample I also demonstrate that you must re-retrieve the value from the map before modifications. I think re-retrieval is also worthy of checking, but I don't know if you'd want to include it in this rule or have a separate rule for that.