diff --git a/src/main/java/bdv/img/cache/VolatileGlobalCellCache.java b/src/main/java/bdv/img/cache/VolatileGlobalCellCache.java index a1a386323ab46d4f42c7f8d04629bf36a6c6487f..08a7c956c4e2b3096006b21006f505ef4e208be1 100644 --- a/src/main/java/bdv/img/cache/VolatileGlobalCellCache.java +++ b/src/main/java/bdv/img/cache/VolatileGlobalCellCache.java @@ -407,20 +407,23 @@ public class VolatileGlobalCellCache< A extends VolatileAccess > implements Cach * * @return a cell with the specified coordinates. */ - public synchronized VolatileCell< A > createGlobal( final int[] cellDims, final long[] cellMin, final int timepoint, final int setup, final int level, final int index, final LoadingStrategy loadingStrategy ) + public VolatileCell< A > createGlobal( final int[] cellDims, final long[] cellMin, final int timepoint, final int setup, final int level, final int index, final LoadingStrategy loadingStrategy ) { final Key k = new Key( timepoint, setup, level, index ); Entry entry = null; - final Reference< Entry > ref = softReferenceCache.get( k ); - if ( ref != null ) - entry = ref.get(); - - if ( entry == null ) + synchronized ( softReferenceCache ) { - final VolatileCell< A > cell = new VolatileCell< A >( cellDims, cellMin, loader.emptyArray( cellDims ) ); - entry = new Entry( k, cell ); - softReferenceCache.put( k, new WeakReference< Entry >( entry ) ); + final Reference< Entry > ref = softReferenceCache.get( k ); + if ( ref != null ) + entry = ref.get(); + + if ( entry == null ) + { + final VolatileCell< A > cell = new VolatileCell< A >( cellDims, cellMin, loader.emptyArray( cellDims ) ); + entry = new Entry( k, cell ); + softReferenceCache.put( k, new WeakReference< Entry >( entry ) ); + } } switch ( loadingStrategy )