diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java index 2843a5ded..03cc73d6a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java @@ -56,23 +56,29 @@ public final class OptiFineBMCLVersionList extends VersionList duplicates = new HashSet<>(); - List root = JsonUtils.GSON.fromJson(task.getResult(), new TypeToken>() { - }.getType()); - for (OptiFineVersion element : root) { - String version = element.getType() + "_" + element.getPatch(); - String mirror = "http://bmclapi2.bangbang93.com/optifine/" + element.getGameVersion() + "/" + element.getType() + "/" + element.getPatch(); - if (!duplicates.add(mirror)) - continue; + lock.writeLock().lock(); - boolean isPre = element.getPatch() != null && (element.getPatch().startsWith("pre") || element.getPatch().startsWith("alpha")); + try { + versions.clear(); + Set duplicates = new HashSet<>(); + List root = JsonUtils.GSON.fromJson(task.getResult(), new TypeToken>() { + }.getType()); + for (OptiFineVersion element : root) { + String version = element.getType() + "_" + element.getPatch(); + String mirror = "http://bmclapi2.bangbang93.com/optifine/" + element.getGameVersion() + "/" + element.getType() + "/" + element.getPatch(); + if (!duplicates.add(mirror)) + continue; - if (StringUtils.isBlank(element.getGameVersion())) - continue; + boolean isPre = element.getPatch() != null && (element.getPatch().startsWith("pre") || element.getPatch().startsWith("alpha")); - String gameVersion = VersionNumber.normalize(element.getGameVersion()); - versions.put(gameVersion, new OptiFineRemoteVersion(gameVersion, version, mirror, isPre)); + if (StringUtils.isBlank(element.getGameVersion())) + continue; + + String gameVersion = VersionNumber.normalize(element.getGameVersion()); + versions.put(gameVersion, new OptiFineRemoteVersion(gameVersion, version, mirror, isPre)); + } + } finally { + lock.writeLock().unlock(); } } };