Burada, compareAndSet (Java'da) kullanılarak kilitlenmeyen bir sıradan bazı kodlar vardır:Bu satırlar kilitlenmeyen bir sırada mı gerekli değil?
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;
}
}
}
(kuyruk ve kuyruk kuyruğu üyeleridir)
Hem deq hemqq işlevinde, ilk kontrol benim için gereksiz görünüyor. ("???" ile yorum yaptılar) Sadece bir çeşit optimizasyon için var olduğundan şüpheleniyorum.
Burada bir şey mi eksik? Bu kontroller kodun doğruluğunu etkiler mi?
(Kod, kod eşdeğerini korurken daha az yuvalanmış ifs ve elseslere sahip olması için kod stilini yeniden düzenlemeye devam etsem de, "Çok İşlemcili Programlama Sanatından" alınmıştır)
Yerel değişkenlerin tutarlı bir şekilde ayarlandığını kontrol ediyor gibi görünüyorlar, ancak kodun doğruluğunu etkileyip etkilemediklerini yanıtlamak için onu başkalarına bırakacağım. –