Back CharacterProtector with ConcurrentHashMap

* This should be an better solution to the thread-safety fix in
  previous commit #2300634 – we still use synchronized to ensure
  the atomicity of two HashMap operations.

Signed-off-by: Alex Coles <alex@alexbcoles.com>