下面是使用compareAndSet來自無鎖隊列一些代碼(在Java中):這些行是否在無鎖隊列中不是必需的?
public void enq(T value) {
Node newNode = new Node(value);
while(true) {
Node last = tail.get();
Node next = last.next.get();
if(last != tail.get())
continue; //???
if (next != null) { //improve tail
tail.compareAndSet(last, next);
continue;
}
if (last.next.compareAndSet(null, newNode)) { //update last node
tail.compareAndSet(last, newNode); //update tail
return;
}
}
}
public T deq() throws EmptyException {
while(true) {
Node first = head.get();
Node last = tail.get();
Node next = first.next.get();
if(first != head.get())
continue; //???
if(first == last) {
if (next == null)
throw new EmptyException();
tail.compareAndSet(last, next);
continue;
}
T value = next.value;
if (head.compareAnsdSet(first, next)) {
return value;
}
}
}
(頭部和尾部是隊列的成員)
在這兩個DEQ和ENQ功能,第一次檢查似乎對我沒有必要。 (那些評論「???」) 我懷疑它只是爲了某種優化。
我在這裏錯過了什麼嗎?這些檢查會影響代碼的正確性嗎?
(代碼是從「的多處理器編程藝術」拍攝,雖然我沒有重構代碼風格有較少的嵌套如果和別人的,同時保持代碼的等價物)
他們似乎在檢查局部變量是否已經被一致地設置,但是我會把它留給其他人來回答它們是否會影響代碼的正確性。 – 2011-03-23 13:24:44