2011-09-05 6 views
0

방금 ​​akka에서 코드 조각을 발견했습니다.AKKA에서 사용되는이 CCAS locking machanizion을 이해하는 방법은 무엇입니까?

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 클래스를 사용합니다. 그래서 자바 태그도 추가합니다.

어떤 조언을 환영합니다! 왜 누군가가이 질문에 투표하는 지 잘 모르겠습니다.

관련 :

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

+0

문제를 해결해야한다고 생각합니다. 당신이 이해하지 못하는 것은 정확히 무엇입니까? –

+0

어떻게 작동하는지에 대한 기본적인 개념이 필요합니다. 고마워요, 선생님 :) –

답변

1

다음은 코드에 대한 이해이다. 인수 (AtomicBoolean)를 뮤텍스로 사용했습니다. 임의의 thread가 락을 취득하려고하면 (자), 취득 된 것을 true로 설정합니다. 이 thread가 취득한 것을 true로 취득 해, false를 돌려 줄 때까지, 다른 thread는 락을 취득 할 수 없습니다.

수집 한 것이 모음집이 아니기 때문에 ABA 문제가 발생하지 않습니다. 그래서 효과가 있습니다.

내가 잘못하면 저를 교정하십시오.

+0

"스레드가 완료 될 때까지"차단하고 싶으면 잠금을 사용할 수있게되기를 기다렸다가 성공할 때까지 tryLock을 반복해야합니다 (잠금이있는 경우) –

+0

감사합니다. 단정. 그것은 내 잘못된 표현 때문일뿐입니다. :-) 나는 그것을 바로 잡을 것이다. –