All of the consumers (including the GC, which is doesn't use the same runner logic or PointerBarrier but does use the same Pointer and WaitStrategy logic) depend only upon their Pointer, PointerBarrier and the WaitStrategy to determine when they can proceed. The Cursor contains the logic to ensure that its Pointer never advances onto the same ring buffer position held by the slowest Pointer (which is always the GC's Pointer).

Therefore, none of the consumers nor the GC need any synchronization or locking among them. In fact, the whole point of this design is that there is no synchronized or lock-based coordination among the consumers. Instead, all movement is constrained by and based purely upon volatile longs (via Pointer, which subclasses AtomicLong).