2016-05-30 25 views
4

CAS如何工作?它如何與垃圾收集器一起工作?問題在哪裏?它如何在沒有垃圾收集器的情況下工作?比較並使用和不使用垃圾收集器

我正在閱讀有關CAS的演示文稿,並在「很少寫入,讀取很多」問題上使用它,並且有人說,雖然您可以使用垃圾回收器,但使用CAS很方便,但存在問題(未指定),而你不能使用垃圾收集器。

你能告訴我關於這方面的一些情況嗎?如果你能首先總結CAS的原理,那將是值得讚賞的。

回答

0

好吧,所以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'永遠不會被分配到該內存位置。