garbage-collection - 比较和交换有无垃圾收集器

标签 garbage-collection atomic compare-and-swap

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

我正在阅读有关 CAS 的演示文稿并将其用于“很少写,读很多”的问题,有人说,使用 CAS 很方便,同时您可以使用垃圾收集器,但是存在问题(未指定)而您不能使用垃圾收集器。

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

最佳答案

好的,所以 CAS 是一个原子指令,也就是说它有特殊的硬件支持。
它的主要用途是在实现数据结构和其他操作时根本不使用锁,因为使用锁,如果线程出现页面错误、缓存未命中或被操作系统取消调度,例如线程使用锁并且所有其余的线程都被阻塞。这显然会产生严重的性能问题。
CAS核心lock-free programmingherehere .

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/

相关文章:

memory-leaks - F# 可观察事件是否消除、调解或与弱引用的需要无关?

Android 垃圾收集器在主线程上运行?

assembly - 在 Cortex-M0 中模拟 LDREX/STREX(加载/存储独占)

c++ - Visual C++ 2010 原子类型支持?

assembly - x86_64 - cmpxchg。返回值

c# - .Net 垃圾收集器中写入障碍的详细信息

java - "Heap size"的增长速度比 "Used heap"快得多

multithreading - 在OMP(gfortran)中使用原子的奇怪结果

c++ - 在二维数组上进行比较和交换

c++ - 使用 OpenMP 原子操作获取和添加