使用和不使用垃圾收集器进行比较和交换

时间:2016-05-30 08:09:57

标签: garbage-collection atomicity compare-and-swap

CAS如何运作?它如何与垃圾收集器一起使用?问题在哪里?如果没有垃圾收集器,它是如何工作的?

我正在阅读关于CAS的演示文稿并在#34上使用它;很少写,阅读很多"问题,并且据说,虽然可以使用垃圾收集器但是CAS的使用方便,但是在不能使用垃圾收集器的时候有问题(未指定)。

你能告诉我一些关于这件事的事吗?如果你能首先总结一下CAS的原理,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

好的,所以CAS是一个原子指令,就是它有特殊的硬件支持。 它的主要用途是在实现数据结构和其他操作时根本不使用锁,因为使用锁,如果线程出现页面错误,高速缓存未命中或被操作系统取消调度,例如线程将锁定它并且所有其余线程都被阻止。这显然会产生严重的性能问题。 CAS是lock-free programminghere以及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;将永远不会分配到该内存位置。