diff --git a/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/world/locations/chunkmeta/block/table/TableBasedBlockChunkMeta.java b/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/world/locations/chunkmeta/block/table/TableBasedBlockChunkMeta.java index d64aeed2a..faaef4a19 100644 --- a/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/world/locations/chunkmeta/block/table/TableBasedBlockChunkMeta.java +++ b/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/world/locations/chunkmeta/block/table/TableBasedBlockChunkMeta.java @@ -12,15 +12,16 @@ public abstract class TableBasedBlockChunkMeta extends BlockBasedChunkMeta> { private static final Logger CHUNK_META_LOGGER = LogManager.getLogger("Chunk meta"); - private List modifiedEntries; + private final List modifiedEntries = new ArrayList<>(); public TableBasedBlockChunkMeta(boolean isNew, TableStorageEngine storage) { super(isNew, storage); - this.modifiedEntries = new ArrayList<>(); } public void reportChange(D data) { - modifiedEntries.add(data); + synchronized (modifiedEntries) { + modifiedEntries.add(data); + } } @SuppressWarnings("unchecked") @@ -28,7 +29,9 @@ public abstract class TableBasedBlockChunkMeta public void put(int x, int y, int z, TableBasedDataObject blockData, boolean isNew) { super.put(x, y, z, blockData, isNew); if (isNew) { - modifiedEntries.add((D) blockData); + synchronized (modifiedEntries) { + modifiedEntries.add((D) blockData); + } } } @@ -40,7 +43,9 @@ public abstract class TableBasedBlockChunkMeta //this may look weird, but is what happens if the data was NEW previously, never written to the //db and doesn't need to be deleted from there either if (blockData.getCacheState() != CacheState.NORMAL) { - modifiedEntries.add((D) blockData); + synchronized (modifiedEntries) { + modifiedEntries.add((D) blockData); + } } } @@ -56,7 +61,12 @@ public abstract class TableBasedBlockChunkMeta @Override public void insert() { CHUNK_META_LOGGER.debug("Inserting at " + chunkCoord); - for (D data : modifiedEntries) { + List datas; + synchronized (modifiedEntries) { + datas = new ArrayList<>(modifiedEntries); + modifiedEntries.clear(); + } + for (D data : datas) { switch (data.getCacheState()) { case NORMAL: continue; @@ -71,7 +81,6 @@ public abstract class TableBasedBlockChunkMeta } data.setCacheState(CacheState.NORMAL); } - modifiedEntries.clear(); } @SuppressWarnings("unchecked")