code: @Override
      public void updateProperties(Dictionary<String, Object> properties) throws IOException {
          lock.lock();
          try {
              doUpdateProperties(properties);
          } finally {
              lock.unlock();
          }
      }
docs: without other guards, separating updating the properties and sending configuration events
  can result in missing and duplicate update events even if every update is eventually associated with an event.