CAS如何运作?它如何与垃圾收集器一起工作?问题出在哪里,没有垃圾收集器它是如何工作的?
我正在阅读有关 CAS 的演示文稿并将其用于“很少写,读很多”的问题,有人说,使用 CAS 很方便,同时您可以使用垃圾收集器,但是存在问题(未指定)而您不能使用垃圾收集器。
你能告诉我一些关于这件事吗?如果您能首先总结CAS的原理,将不胜感激。
最佳答案
好的,所以 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' 永远不会被分配到该内存位置。关于garbage-collection - 比较和交换有无垃圾收集器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37520672/