Rozważając następujący przypadek:

Początkowo stos zwiera top → A → B → C

Wątek 1 rozpoczyna zdejmowanie obiektu ze stosu (Pop): ret = A; next = B; Wątek 1 zostaje przerwany tuż przed CompareAndSwap...

{ // Wątek 2 zdejmuje obiekt ze stosu (pop): ret = A; next = B; CompareAndSwap(A, A, B) // Sukces, top = B return A; } // Teraz stos zawiera top → B → C { // Wątek 2 zdejmuje kolejny element: ret = B; next = C; CompareAndSwap(B, B, C) // Sukces, top = C return B; } // Teraz stos zawiera top → C delete B; { // Wątek 2 umieszcza A z powrotem na stosie: A->next = C; CompareAndSwap(C, C, A) // Sukces, top = A

Teraz na stosie znajdują się top → A → C

Kiedy wątek 1 wznawia działanie: CompareAndSwap(A, A, B)

Ta instrukcja się udaje, gdyż zauważa, że top == ret (obie są równe A), wobec czego ustawia szczyt na następny (który wynosi B). Z uwagi na to, że B został z pamięci usunięty (delete), program będzie się odwoływał do zwolnionej pamięci, kiedy nastąpi próba odczytu pierwszego elementu na stosie. Zachowanie w przypadku dostępu do zwolnionej pamięci jest niezdefiniowane i zwykle prowadzi do szybkiej i nieoczekiwanej awarii aplikacji.