2011-02-14 2 views
4

나는이 작은 클래스를 만들어 그것의 표준 구현을 찾을 수 있지만,이 어딘가에 이미 존재해야 나는 간단한 무언가를 생각하기 때문에 :이러한 종류의 동시성 관련 클래스를 어떻게 호출합니까? 표준 구현이 있습니까?

class ReturnValue { 
    private var value = false 

    private val latch = new java.util.concurrent.CountDownLatch(1) 

    def setValue(aValue: Boolean) { 
     value = aValue 
     latch.countDown() 
    } 
    def getValue() = { 
     latch.await 
     value 
    } 
} 

그것의 목적은 두 스레드 사이의 값을 교환하는 것입니다 (내 경우에는 메인 스레드 + EDT). getValue() 메서드를 사용하는 코드에서 Future와 비슷하게 보이지만 Future 구현에서는 호출자가 코드를 제공하여 내 경우에는 작동하지 않는다고 기대합니다.

그래서 내 질문은 :

  • 같은 꼬추의 이름이 있습니까?
  • java 또는 scala에 대한 표준 구현이 있습니까?
  • 구현이 정확합니까? 더 일방적이다 제외하고, 나에 Exchanger 같은 비트 보이는
+0

나는 그것을 "Java가 아니다"라고 부른다 :-) –

+0

두 개의 질문 ... * setValue *는 두 번 이상 호출되어야 하는가? * setValue *가 두 번 이상 호출되면,이 코드는 실제로 정확하게 동기화됩니까? (저는 스칼라에 대해 많이 알지 못합니다. 그러나 * getValue *가 올바른 값을 돌려 줄 수있는 방법을 보지 못했습니다. * latch.wait * 충분합니까?) – Gugussee

+0

@Gugussee correct : setValue는 한 번만 호출됩니다. latch.await 충분하니? 나는 그렇게 생각한다. 그러나 나는 그것에 돈을 걸지 않을 것이다. –

답변

11

스칼라 표준 라이브러리는 scala.concurrent.SyncVar[T] 클래스와 같은 종류의 동기화 메커니즘을 제공합니다. 그것이 어떻게 작동하는지

이 스칼라 REPL 세션

을 보여줍니다 :

scala> import concurrent._   
import concurrent._ 

scala> import ops._     
import ops._ 

나는 쉽게 다른 Thread를 생성하는 ops._을 수입하고있다.

scala> val syncInt = new SyncVar[Int] 
syncInt: scala.concurrent.SyncVar[Int] = [email protected] 

scala> spawn { println("got %d" format syncInt.get) } 

다른 스레드가 생성됩니다. 은 syncInt에 값이있을 때까지 차단됩니다.

scala> syncInt.isSet 
res1: Boolean = false 

scala> syncInt.set(103) 

scala> got 103 

위의 내용은 이전에 작성한 스레드에 의해 인쇄되었습니다.

scala> syncInt.isSet 
res3: Boolean = true 

scala> syncInt.get 
res4: Int = 103 
4

... 당신이 그 받게 요? 기본적으로 "대기중인"쪽에서 제공 한 내용이나 "제공하는"부분에서받은 내용에 대해 걱정할 필요가 없습니다.

저는 "실행 가능"부분을 제외하고는 미래와 같이 보인다고 동의합니다.

+0

그래, 나는 그것을보고 기억하고있다. "중요한 점은"getter "스레드가 getValue라는"getter "스레드까지"setter "스레드도 블로킹해야한다는 것이지만 Exchanger 제안을 위해"절반 만 필요하다 "는 것을 기억한다. –

+1

+1()'. 일반적인 경우, 나는 그것이 바람직하지 않다고 생각한다. 그렇지 않으면 getter가 setter 스레드에 의해 무시되는 더미 값을 제공 할 수있다. –

5

하나의 요소가있는 synchronous queue과 다소 비슷하게 보입니다. 생산자가 값을 제공하려면 소비자가 wait이어야합니다.

+1

'SynchronousQueue'에서 프로듀서는 소비자가 값을 가져 오기를 기다립니다. – axtavt

+0

SynchronousQueue에 요소가 없습니다. javadocs에서 : "동기식 대기열에는 내부 용량이 없으며 하나의 용량도 없습니다." –

1

BlockingReference과 매우 유사한 것을 만들었습니다. 소비자 (하나 또는 여러 명)가 최신 값이나 블록을 읽을 수있을 때까지 읽을 수 있어야했습니다. 본질적으로 그것은 프로듀서 스레드가 언제든지 새로운 값을 게시 한 다음 계속할 수 있기 때문에 단일 요소 큐와 같습니다. 게시되어야하는 유일한 정보가 어떤 종류의 상태 업데이트 인 경우 관련성이 있습니다. 나는 다중 스레드 콘텐츠 배포 캐시 (한 스레드가 콘텐츠를 다운로드하고 다운로드 한 바이트를 재방송하는 여러 소비자가있는)에서 진행 상황을 표시합니다. 귀하의 주요 차이점은 귀하의 것이 단일 용도라는 것입니다.

이 구현은 핸드 오프가 발생할 때까지 생산자 스레드를 차단하기 때문에 SynchronousQueueExchanger보다 훨씬 우수합니다. 생산자 스레드는 블로킹없이 구현되며 여러 소비자를 지원할 수 있으므로 기능면에서 Scala SyncVar보다 우수합니다. 그것은 크게 성능 최적화되었습니다.

Atlassian Concurrency lib는 Apache2 라이센스가 있으며 공개 Maven 저장소에 있습니다.

관련 문제