Trace&1&&&&&&&&public&E&take()&{&&&&&&&&&&&&for&(;;)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&Keep&trying&&1 &Node<E>&oldHead&=&head.get();&&&&&&&&&&&&&&&&&&&&&&&&//¤t&head&2 &Node<E>&oldTail&=&tail.get();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//¤t&tail&3 &Node<E>&oldHeadNext&=&oldHead.next.get();&//&curr&head.next&4 &if&(oldHead&==&head.get())&{&&&&&//head,&tail,&and&next&changed?&5 &&&&&if&(oldHead&==&oldTail)&{&&&&&&//Queue&empty&or&tail&updated?&6 &&&&&&&&&if&(oldHeadNext&==&null)&{&&&&&&&&&&&&&&&&&&&&&&//&Is&queue&empty?&7 & &return&null;&&&&&&&&&&&&&&&&&&&&&&&&&&&//Queue&is&empty,&can't&take&&&&&&&&&&}&8 &&&&tail.compareAndSet(oldTail,&oldHeadNext);&//&tail&updaVng&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&No&need&to&deal&with&tail&9 &if&(head.compareAndSet(oldHead,&oldHeadNext))&{&10 &return&oldHeadNext.item;&}&}&}&}&}&Var&T1&T2&oldHead&oldTail&oldHeadNext&&head&tail&0& 1& 2& λ&Trace&1&&&&&&&&public&E&take()&{&&&&&&&&&&&&for&(;;)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&Keep&trying&&1 &Node<E>&oldHead&=&head.get();&&&&&&&&&&&&&&&&&&&&&&&&//¤t&head&2 &Node<E>&oldTail&=&tail.get();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//¤t&tail&3 &Node<E>&oldHeadNext&=&oldHead.next.get();&//&curr&head.next&4 &if&(oldHead&==&head.get())&{&&&&&//head,&tail,&and&next&changed?&5 &&&&&if&(oldHead&==&oldTail)&{&&&&&&//Queue&empty&or&tail&updated?&6 &&&&&&&&&if&(oldHeadNext&==&null)&{&&&&&&&&&&&&&&&&&&&&&&//&Is&queue&empty?&7 & &return&null;&&&&&&&&&&&&&&&&&&&&&&&&&&&//Queue&is&empty,&can't&take&&&&&&&&&&}&8 &&&&tail.compareAndSet(oldTail,&oldHeadNext);&//&tail&updaVng&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&No&need&to&deal&with&tail&9 &if&(head.compareAndSet(oldHead,&oldHeadNext))&{&10 &return&oldHeadNext.item;&}&}&}&}&}&Var&T1&T2&oldHead&oldTail&oldHeadNext&&head&tail&0& 1& 2& λ&Trace&1&&&&&&&&public&E&take()&{&&&&&&&&&&&&for&(;;)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&Keep&trying&&1 &Node<E>&oldHead&=&head.get();&&&&&&&&&&&&&&&&&&&&&&&&//¤t&head&2 &Node<E>&oldTail&=&tail.get();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//¤t&tail&3 &Node<E>&oldHeadNext&=&oldHead.next.get();&//&curr&head.next&4 &if&(oldHead&==&head.get())&{&&&&&//head,&tail,&and&next&changed?&5 &&&&&if&(oldHead&==&oldTail)&{&&&&&&//Queue&empty&or&tail&updated?&6 &&&&&&&&&if&(oldHeadNext&==&null)&{&&&&&&&&&&&&&&&&&&&&&&//&Is&queue&empty?&7 & &return&null;&&&&&&&&&&&&&&&&&&&&&&&&&&&//Queue&is&empty,&can't&take&&&&&&&&&&}&8 &&&&tail.compareAndSet(oldTail,&oldHeadNext);&//&tail&updaVng&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&No&need&to&deal&with&tail&9 &if&(head.compareAndSet(oldHead,&oldHeadNext))&{&10 &return&oldHeadNext.item;&}&}&}&}&}&Var&T1&T2&oldHead&oldTail&oldHeadNext&&head&tail&0& 1& 2& λ&Trace&1&&&&&&&&public&E&take()&{&&&&&&&&&&&&for&(;;)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&Keep&trying&&1 &Node<E>&oldHead&=&head.get();&&&&&&&&&&&&&&&&&&&&&&&&//¤t&head&2 &Node<E>&oldTail&=&tail.get();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//¤t&tail&3 &Node<E>&oldHeadNext&=&oldHead.next.get();&//&curr&head.next&4 &if&(oldHead&==&head.get())&{&&&&&//head,&tail,&and&next&changed?&5 &&&&&if&(oldHead&==&oldTail)&{&&&&&&//Queue&empty&or&tail&updated?&6 &&&&&&&&&if&(oldHeadNext&==&null)&{&&&&&&&&&&&&&&&&&&&&&&//&Is&queue&empty?&7 & &return&null;&&&&&&&&&&&&&&&&&&&&&&&&&&&//Queue&is&empty,&can't&take&&&&&&&&&&}&8 &&&&tail.compareAndSet(oldTail,&oldHeadNext);&//&tail&updaVng&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&No&need&to&deal&with&tail&9 &if&(head.compareAndSet(oldHead,&oldHeadNext))&{&10 &return&oldHeadNext.item;&}&}&}&}&}&Var&T1&T2&oldHead&oldTail&oldHeadNext&&head&tail&0& 1& 2& λ&Trace&1&&&&&&&&public&E&take()&{&&&&&&&&&&&&for&(;;)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&Keep&trying&&1 &Node<E>&oldHead&=&head.get();&&&&&&&&&&&&&&&&&&&&&&&&//¤t&head&2 &Node<E>&oldTail&=&tail.get();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//¤t&tail&3 &Node<E>&oldHeadNext&=&oldHead.next.get();&//&curr&head.next&4 &if&(oldHead&==&head.get())&{&&&&&//head,&tail,&and&next&changed?&5 &&&&&if&(oldHead&==&oldTail)&{&&&&&&//Queue&empty&or&tail&updated?&6 &&&&&&&&&if&(oldHeadNext&==&null)&{&&&&&&&&&&&&&&&&&&&&&&//&Is&queue&empty?&7 & &return&null;&&&&&&&&&&&&&&&&&&&&&&&&&&&//Queue&is&empty,&can't&take&&&&&&&&&&}&8 &&&&tail.compareAndSet(oldTail,&oldHeadNext);&//&tail&updaVng&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&No&need&to&deal&with&tail&9 &if&(head.compareAndSet(oldHead,&oldHeadNext))&{&10 &return&oldHeadNext.item;&}&}&}&}&}&Var&T1&T2&oldHead&oldTail&oldHeadNext&&head&tail&0& 1& 2& λ&Trace&1&&&&&&&&public&E&take()&{&&&&&&&&&&&&for&(;;)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&Keep&trying&&1 &Node<E>&oldHead&=&head.get();&&&&&&&&&&&&&&&&&&&&&&&&//¤t&head&2 &Node<E>&oldTail&=&tail.get();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//¤t&tail&3 &Node<E>&oldHeadNext&=&oldHead.next.get();&//&curr&head.next&4 &if&(oldHead&==&head.get())&{&&&&&//head,&tail,&and&next&changed?&5 &&&&&if&(oldHead&==&oldTail)&{&&&&&&//Queue&empty&or&tail&updated?&6 &&&&&&&&&if&(oldHeadNext&==&null)&{&&&&&&&&&&&&&&&&&&&&&&//&Is&queue&empty?&7 & &return&null;&&&&&&&&&&&&&&&&&&&&&&&&&&&//Queue&is&empty,&can't&take&&&&&&&&&&}&8 &&&&tail.compareAndSet(oldTail,&oldHeadNext);&//&tail&updaVng&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&No&need&to&deal&with&tail&9 &if&(head.compareAndSet(oldHead,&oldHeadNext))&{&10 &return&oldHeadNext.item;&}&}&}&}&}&Var&T1&T2&oldHead&oldTail&oldHeadNext&&head&tail&0& 1& 2& λ&Trace&1:&T1&wins,&CAS&succeeds&&&&&&&&public&E&take()&{&&&&&&&&&&&&for&(;;)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&Keep&trying&&1 &Node<E>&oldHead&=&head.get();&&&&&&&&&&&&&&&&&&&&&&&&//¤t&head&2 &Node<E>&oldTail&=&tail.get();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//¤t&tail&3 &Node<E>&oldHeadNext&=&oldHead.next.get();&//&curr&head.next&4 &if&(oldHead&==&head.get())&{&&&&&//head,&tail,&and&next&changed?&5 &&&&&if&(oldHead&==&oldTail)&{&&&&&&//Queue&empty&or&tail&updated?&6 &&&&&&&&&if&(oldHeadNext&==&null)&{&&&&&&&&&&&&&&&&&&&&&&//&Is&queue&empty?&7 & &return&null;&&&&&&&&&&&&&&&&&&&&&&&&&&&//Queue&is&empty,&can't&take&&&&&&&&&&}&8
View Full Document