### Question:
NodeLabelsCache implements MemoryStatsVisitor.Visitable, AutoCloseable { public void put( long nodeId, long[] labelIds ) { putClient.labelBits.clear( true ); putClient.labelBits.put( labelIds.length, bitsPerLabel ); for ( long labelId : labelIds ) { putClient.labelBits.put( (int) labelId, bitsPerLabel ); } int longsInUse = putClient.labelBits.longsInUse(); assert longsInUse > 0 : "Uhm"; if ( longsInUse == 1 ) { cache.set( nodeId, putClient.labelScratch[0] ); } else { putClient.fieldBits.clear( true ); putClient.fieldBits.put( labelIds.length, bitsPerLabel ); putClient.fieldBits.put( spillOverIndex, Long.SIZE - bitsPerLabel ); cache.set( nodeId, putClient.fieldBits.getLongs()[0] ); for ( int i = 0; i < longsInUse; i++ ) { spillOver.set( spillOverIndex++, putClient.labelScratch[i] ); } } } NodeLabelsCache( NumberArrayFactory cacheFactory, int highLabelId );  NodeLabelsCache( NumberArrayFactory cacheFactory, int highLabelId, int chunkSize ); Client newClient(); void put( long nodeId, long[] labelIds ); int[] get( Client client, long nodeId, int[] target ); @Override void acceptMemoryStatsVisitor( MemoryStatsVisitor visitor ); @Override void close();  }### Answer:
@Test public void shouldSupportConcurrentGet() throws Throwable { int highLabelId = 10; int numberOfNodes = 100; int[][] expectedLabels = new int[numberOfNodes][]; NodeLabelsCache cache = new NodeLabelsCache( NumberArrayFactory.AUTO_WITHOUT_PAGECACHE, highLabelId ); for ( int i = 0; i < numberOfNodes; i++ ) { cache.put( i, asLongArray( expectedLabels[i] = randomLabels( random.nextInt( 5 ), highLabelId ) ) ); } Race getRace = new Race(); for ( int i = 0; i < 10; i++ ) { getRace.addContestant( new LabelGetter( cache, expectedLabels, numberOfNodes ) ); } getRace.go(); }