Just tried ConcurrentHashMap and unit tests found a race condition between reading map size (used for sequentially increasing counter) and putIfAbsent call. Possibly existed in old implementation too, but wasn't tickled.
Opted for a standard (non thread-aware) map and a synchronized { } block containing both the getOrElseUpdate call and map size lookup. Thought about other schemes like Atomic[Int] and thread-local reader maps but those seem to have their own downsides.