有什么是abab?
通俗來講就是你大爺還是你大爺,你大媽已經不是你大媽了^_^舉個例子A --> B --> C假設你有個用單鏈表實現的棧,如上面所示,有個head指針指向棧頂的A用CAS原子操作,你可能會這樣實現push和pop
ABA的問題在于,pop函數中,next = curr->next 和 while之間,線程被切換走,然后其他線程先把A彈出,又把B彈出,然后又把A壓入,棧變成 了A --> C,此時head還是指向A,等pop被切換回來繼續執行,就把head指向B了。因此ABA問題的本質是內存回收的問題,對于上面的例子,就是A被彈出后,需要保證它的內存不能立即釋放(因為還有線程引用它),也就不能立即被重用。這是新手使用CAS最常見的坑,實際項目中,通常配合128位CAS、引用計數、序列號或者HazardPointer等技術來避免ABA問題。