#1: Ordering point of the deque as the following: First of all, the normal usage scenario of the deque is that the main thread calls push() or take() to add or remove elements into the deque from the bottom (at the same side) while other independent threads call steal() to remove elements from the top (at the other side). Thus intuitively, we use the store of the Bottom as the ordering point of push(). For take() and steal(), when there's no race between them, meaning that there are more than one element, we also use the load of Bottom as their ordering points. However, when take() has to remove an preemptively, it will use a CAS to update the Top to race with other stealing threads. Thus, in that case, we have additional ordering points at the CAS/Load (when failure happens) to order the steal() and the take().