protected @NotNull ZipFile getZipFile() throws IOException {
    // This code is executed at least 100K times (O(number of classes needed to load)) and it takes considerable time to open ZipFile's
    // such number of times, so we store reference to ZipFile if we allowed locking the file (assume it isn't changed)
    if (myConfiguration.myCanLockJars) {
      SoftReference<ZipFile> ref = myZipFileSoftReference;
      ZipFile zipFile = ref == null ? null : ref.get();
      if (zipFile != null) {
        return zipFile;
      }

      synchronized (ourLock) {
        ref = myZipFileSoftReference;
        zipFile = ref == null ? null : ref.get();
        if (zipFile != null) {
          return zipFile;
        }

        // ZipFile's native implementation (ZipFile.c, zip_util.c) has path -> file descriptor cache
        zipFile = createZipFile(myFilePath);
        myZipFileSoftReference = new SoftReference<>(zipFile);
        return zipFile;
      }
    }
    return createZipFile(myFilePath);
  }
protected @NotNull ZipFile getZipFile()