Stack top is a sequence
[Java]
Public class ConcurrentStack <E> {
AtomicReference <Node <E> top = new AtomicReference <Node <E> ();
Public void push (E item ){
Node <E> newHead = new Node <E> (item );
Node <E> oldHead = null;
Do {
OldHead = top. get ();
NewHead. next = oldHead;
} While (! Top. compareAndSet (oldHead, newHead ));
}
Public E pop (){
Node <E> newHead = null;
Node <E> oldHead = null;
Do {
OldHead = top. get ();
If (oldHead = null ){
Return null;
}
NewHead = oldHead. next;
} While (! Top. compareAndSet (oldHead, newHead ));
Return oldHead. item;
}
Private static class Node <E> {
Public final E item;
Public Node <E> next;
Public Node (E item ){
This. item = item;
}
}
}
Public class ConcurrentStack <E> {
AtomicReference <Node <E> top = new AtomicReference <Node <E> ();
Public void push (E item ){
Node <E> newHead = new Node <E> (item );
Node <E> oldHead = null;
Do {
OldHead = top. get ();
NewHead. next = oldHead;
} While (! Top. compareAndSet (oldHead, newHead ));
}
Public E pop (){
Node <E> newHead = null;
Node <E> oldHead = null;
Do {
OldHead = top. get ();
If (oldHead = null ){
Return null;
}
NewHead = oldHead. next;
} While (! Top. compareAndSet (oldHead, newHead ));
Return oldHead. item;
}
Private static class Node <E> {
Public final E item;
Public Node <E> next;
Public Node (E item ){
This. item = item;
}
}
}
Michael Scott 1996
Two sequences: team end and tail Node
[Java]
Public class ConcurrentLink <E> {
Private final Node <E> dummy = new Node <E> (null, null );
Private final AtomicReference <Node <E> head =
New AtomicReference <Node <E> (dummy );
Private final AtomicReference <Node <E> tail =
New AtomicReference <Node <E> (dummy );
Public boolean push (E item ){
Node <E> newNode = new Node <E> (item, null );
While (true ){
Node <E> curTail = tail. get ();
Node <E> tailNext = curTail. next. get ();
If (curTail = tail. get ()){
If (tailNext! = Null ){
Tail. compareAndSet (curTail, tailNext );
} Else {
If (curTail. next. compareAndSet (null, newNode )){
Tail. compareAndSet (curTail, newNode );
Return true;
}
}
}
}
}
Private static class Node <E> {
Final E item;
Final AtomicReference <Node <E> next;
Public Node (E item, Node <E> next ){
This. item = item;
This. next = new AtomicReference <Node <E> (next );
}
}
}