A concurrent object behaves as if its operations took effect at individual instants between invocation and response, respecting nonoverlapping operations' real-time order. A read overlapping a replacement can return the old version while remaining linearizable.