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 )