package net.minecraft.core.registries; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import net.minecraft.core.Holder; import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderSet; import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; public class ConcurrentHolderGetter implements HolderGetter { private final Object lock; private final HolderGetter original; private final Map, Optional>> elementCache = new ConcurrentHashMap(); private final Map, Optional>> tagCache = new ConcurrentHashMap(); public ConcurrentHolderGetter(final Object lock, final HolderGetter original) { this.lock = lock; this.original = original; } @Override public Optional> get(final ResourceKey elementId) { return (Optional>)this.elementCache.computeIfAbsent(elementId, id -> { synchronized (this.lock) { return this.original.get(id); } }); } @Override public Optional> get(final TagKey tagId) { return (Optional>)this.tagCache.computeIfAbsent(tagId, id -> { synchronized (this.lock) { return this.original.get(id); } }); } }