class FileLock {

    public void decreaseLock(@NonNull String path) {
        AtomicInteger lockCount;
        synchronized (fileLockCountMap) {
            lockCount = fileLockCountMap.get(path);
        }

        if (lockCount != null && lockCount.decrementAndGet() == 0) {
            Util.d(TAG, "decreaseLock decrease lock-count to 0 " + path);
            final Thread lockedThread;
            synchronized (waitThreadForFileLockMap) {
                lockedThread = waitThreadForFileLockMap.get(path);
                if (lockedThread != null) {
                    waitThreadForFileLockMap.remove(path);
                }
            }

            if (lockedThread != null) {
                Util.d(TAG, "decreaseLock " + path + " unpark locked thread " + lockCount);
                unpark(lockedThread);
            }
            synchronized (fileLockCountMap) {
                fileLockCountMap.remove(path);
            }
        }
    }

      FileLock(@NonNull Map<String, AtomicInteger> fileLockCountMap,
             @NonNull Map<String, Thread> waitThreadForFileLockMap);
      FileLock();

}