2011-09-05 17 views
0

我剛剛在akka中遇到了一段代碼。如何理解AKKA中使用的CCAS鎖定機制?

https://codereview.scala-lang.org/fisheye/browse/~raw,r=25521/scala-svn/scala/trunk/test/files/presentation/akka/src/akka/util/LockUtil.scala

的核心方法我很感興趣,下面列出。

/** 
* A very simple lock that uses CCAS (Compare Compare-And-Swap) 
* Does not keep track of the owner and isn't Reentrant, so don't nest and try to stick to the if*-methods 
*/ 
class SimpleLock { 
    val acquired = new AtomicBoolean(false) 

    def ifPossible(perform:() => Unit): Boolean = { 
    if (tryLock()) { 
     try { 
     perform 
     } finally { 
     unlock() 
     } 
     true 
    } else false 
    } 



    def tryLock() = { 
    if (acquired.get) false 
    else acquired.compareAndSet(false, true) 
    } 

    def tryUnlock() = { 
    acquired.compareAndSet(true, false) 
    } 

有兩個相關的子問題。

1)這是什麼類SimpleLock

2)任何提示或背景知識,它是如何工作的目的是什麼?

我覺得這段代碼是用JAVA和scala編寫的,它利用了AtomicBoolean類。 所以我也會添加java標籤。

歡迎任何建議!不知道爲什麼有人投票關閉這個問題。

相關:

Can anyone interpret this C++ code (from OpenJDK6) into plain English?

+0

我認爲你需要改進你的問題。究竟是什麼,你不明白? –

+0

我只需要一些關於它如何工作的基本概念。謝謝,先生:) –

回答

1

這裏是我的代碼的理解。它使用一個獲得的(AtomicBoolean)作爲互斥體。如果任何線程試圖獲取該鎖,那麼它將設置爲真。那麼任何其他線程都無法獲得該鎖,因爲它們將從獲取中變爲真並返回false,直到此獲取的線程被此線程設置爲false。

由於並非來自一個集合,它不會有ABA問題。所以它可以工作。

如果我錯了,請糾正我。

+0

沒有「直到線程完成」,如果你想阻塞,等待鎖可用,你需要循環tryLock直到成功(並且你有鎖) –

+0

感謝正確性。這只是由於我錯誤的措辭。 :-)我會糾正它。 –