From 30707c89a4d9e64fabe2d1bcc5eaa44aafc9ab47 Mon Sep 17 00:00:00 2001 From: trard Date: Fri, 29 May 2026 14:17:43 +0300 Subject: [PATCH] Fix concurrency issue by swapping ArrayList to ConcurrentHashMap --- src/main/java/com/dre/brewery/MCBarrel.java | 6 ++-- .../brewery/listeners/InventoryListener.java | 35 +++++-------------- 2 files changed, 12 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/dre/brewery/MCBarrel.java b/src/main/java/com/dre/brewery/MCBarrel.java index 25890b71..cae6a17d 100644 --- a/src/main/java/com/dre/brewery/MCBarrel.java +++ b/src/main/java/com/dre/brewery/MCBarrel.java @@ -36,15 +36,15 @@ import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; -import java.util.ArrayList; -import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; public class MCBarrel { public static final String TAG = "Btime"; public static long mcBarrelTime; // Globally stored Barrel time. Difference between this and the time stored on each mc-barrel will give the barrel age time - public static List openBarrels = new ArrayList<>(); + public static final ConcurrentMap openBarrels = new ConcurrentHashMap<>(); private static final Config config = ConfigManager.getConfig(Config.class); private static final Lang lang = ConfigManager.getConfig(Lang.class); diff --git a/src/main/java/com/dre/brewery/listeners/InventoryListener.java b/src/main/java/com/dre/brewery/listeners/InventoryListener.java index e7f2cef4..c9ff9357 100644 --- a/src/main/java/com/dre/brewery/listeners/InventoryListener.java +++ b/src/main/java/com/dre/brewery/listeners/InventoryListener.java @@ -58,7 +58,6 @@ import org.bukkit.inventory.meta.PotionMeta; import java.util.HashSet; -import java.util.Iterator; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -310,14 +309,7 @@ public void onInventoryClickMCBarrel(InventoryClickEvent event) { if (!config.isAgeInMCBarrels()) return; Inventory inv = event.getInventory(); - for (MCBarrel barrel : MCBarrel.openBarrels) { - if (barrel.getInventory().equals(inv)) { - barrel.clickInv(event); - return; - } - } - MCBarrel barrel = new MCBarrel(inv); - MCBarrel.openBarrels.add(barrel); + MCBarrel barrel = MCBarrel.openBarrels.computeIfAbsent(inv, MCBarrel::new); barrel.clickInv(event); } @@ -363,14 +355,7 @@ public void onInventoryOpen(InventoryOpenEvent event) { // Check for MC Barrel if (event.getInventory().getType() == InventoryType.BARREL) { Inventory inv = event.getInventory(); - for (MCBarrel barrel : MCBarrel.openBarrels) { - if (barrel.getInventory().equals(inv)) { - barrel.open(); - return; - } - } - MCBarrel barrel = new MCBarrel(inv); - MCBarrel.openBarrels.add(barrel); + MCBarrel barrel = MCBarrel.openBarrels.computeIfAbsent(inv, MCBarrel::new); barrel.open(); } } @@ -433,16 +418,14 @@ public void onInventoryClose(InventoryCloseEvent event) { // Check for MC Barrel if (config.isAgeInMCBarrels() && event.getInventory().getType() == InventoryType.BARREL) { Inventory inv = event.getInventory(); - for (Iterator iter = MCBarrel.openBarrels.iterator(); iter.hasNext(); ) { - MCBarrel barrel = iter.next(); - if (barrel.getInventory().equals(inv)) { - barrel.close(); - if (inv.getViewers().size() == 1) { - // Last viewer, remove Barrel from List of open Barrels - iter.remove(); - } - return; + MCBarrel barrel = MCBarrel.openBarrels.get(inv); + if (barrel != null) { + barrel.close(); + if (inv.getViewers().size() == 1) { + // Last viewer, remove Barrel from open Barrel tracking + MCBarrel.openBarrels.remove(inv, barrel); } + return; } new MCBarrel(inv).close(); }