Each LookupSource has it's own copy of OuterPositionTracker instance.
Each of those OuterPositionTracker must be committed after last write
and before first read.
All instances share visitedPositions array, but it is safe because each thread
starts with visitedPositions filled with false values and marks only some positions
to true. Since we don't care what will be the order of those writes to
visitedPositions, writes can be without synchronization.
Memory visibility between last writes in commit() and first read in
getVisitedPositions() is guaranteed by accessing AtomicLong referenceCount
variables in those two methods.