AtomicReferences can be reordered in weird ways- the content of an atomic reference is always coherent (that is, it's guaranteed not to be a check to some processor cache) but it isn't a full memory barrier. So it won't have two values at once to two threads, but you can't really say which thread acted first.