我在練習冊併發調查ABA問題,維基百科和我已閱讀下列post爲什麼自動垃圾回收消除了ABA的問題?
據我瞭解ABA問題的根本原因是,在algoritm我們檢查狀態同樣如前,但算法意味着狀態未觸及。
實施例與堆棧:
添加元素堆棧,我們使用下列algoritm:
create new stack node(save to `newNode` variable)
while(true) {
oldHead = stack.get();
newNode.next = oldHead; // point_1
if(stack.compareAndSet(oldhead, newNode)) { // atomically replace head if now head same as was in start of iteration
break;
}
}
步驟,其LEED到ABA問題:
初始狀態
a->b->c // a-head, c- tail.
Thread_1嘗試增加值
d
到堆棧和OS暫停之前compareAndSet操作(_1)的螺紋Thread_2然後執行彈出(Thread_1仍然懸浮)
B->Ç// B-頭,C-尾。
Thread_3然後執行彈出(Thread_1仍然懸浮)
Ç// C型頭,C-尾。
Thread_4然後執行推
a
(Thread_1仍然懸浮)A->Ç//一個頭,C-尾。
雖然在某些情況下可能不合需要,但Thread_1會喚醒並且cas操作成功執行。
Althoug this post被接受我不明白爲什麼自動垃圾收集可以消除問題。
雖然我不是C專家,但我明白在C中你不能爲兩個不同的對象分配一個內存範圍。
你能澄清一下嗎?