CAS如何运作?它如何与垃圾收集器一起使用?问题在哪里?如果没有垃圾收集器,它是如何工作的?
我正在阅读关于CAS的演示文稿并在#34上使用它;很少写,阅读很多"问题,并且据说,虽然可以使用垃圾收集器但是CAS的使用方便,但是在不能使用垃圾收集器的时候有问题(未指定)。
你能告诉我一些关于这件事的事吗?如果你能首先总结一下CAS的原理,我们将不胜感激。答案 0 :(得分:0)
好的,所以CAS是一个原子指令,就是它有特殊的硬件支持。 它的主要用途是在实现数据结构和其他操作时根本不使用锁,因为使用锁,如果线程出现页面错误,高速缓存未命中或被操作系统取消调度,例如线程将锁定它并且所有其余线程都被阻止。这显然会产生严重的性能问题。 CAS是lock-free programming和here以及here的核心。
CAS基本上如下:CAS(CURRENT_VALUE, OLD_VALUE, NEW_VALUE) <=>
if CURRENT_VALUE==OLD_VALUE then CURRENT_VALUE = NEW_VALUE
你有一个变量(例如类变量),如果在你从中读取它并且想要写入它的时候被其他线程修改过,你就不知道了。 CAS在这里帮助你写入部分,因为这个CAS是以原子方式(在硬件中)完成的,并且没有在那里实现锁定,因此即使你的线程进入休眠状态,其余的线程也可以对你的数据结构进行操作。
非GC系统上CAS的问题是ABA problem,示例如下:
You have a single linked list: HEAD->A->X->Y->Z
Thread 1: let's read A: localA = A; localA_Value = A.Value (let's say 5)
Thread 2: let's delete A: HEAD->A->X->Y->Z
Thread 3: let's add a new node at start (the malloc will find the right spot right were old A was): HEAD->A'->X->Y->Z (A'.Value = 10)
Thread 1 resumes and wants to swap A with B: CAS(localA, A', B) => but this thread expects that if CAS passes the value of A to be 5; wrong: since CAS passes given that localA and A' have the same memory location but localA.Value!=A'.Value => thus the operation shouldn't be performed.
问题在于,在GC启用的系统中,这种情况永远不会发生,因为localA
拥有对该内存位置的引用,因此A&#39;将永远不会分配到该内存位置。