public static synchronized DeferredReleaser getInstance() {
    if (sInstance == null) {
      sInstance = new DeferredReleaserConcurrentImpl();
    }
    return sInstance;
  }
Component that defers {@code release} until after the main Looper has completed its current
message. Although we would like for defer {@code release} to happen immediately after the current
message is done, this is not guaranteed as there might be other messages after the current one,
but before the deferred one, pending in the Looper's queue.

<p>onDetach / onAttach events are used for releasing / acquiring resources. However, sometimes we
get an onDetach event followed by an onAttach event within the same loop. In order to avoid
overaggressive resource releasing / acquiring, we defer releasing. If onAttach happens within the
same loop, we will simply cancel corresponding deferred release, avoiding an unnecessary resource
release / acquire cycle. If onAttach doesn't happen before the deferred message gets executed,
the resources will be released.
drawee/src/main/java/com/facebook/drawee/components/DeferredReleaser.java