멀티 스레딩에서 코드를 작성하는 법을 배우고 있습니다. 스칼라에서 synchronized 연산자의 문자 적 의미를 이해합니다. 그러나 다음 코드를 실행하면 결과를 이해할 수 없습니다.동기화 된 정의를 이해하기가 어려움
package examples
import scala.concurrent.ops._
object concurrent extends App {
class BoundedBuffer[A](N:Int) {
var in = 0;
var out = 0;
var n = 0;
def put(x:A) = synchronized {
while(n>=N)
wait()
in = (in + 1)/N;
n = n+1;
println("In put.")
if(n==1)
notifyAll()
}
def get = synchronized {
while(n==0)
wait()
out = (out + 1)%N;
n = n-1;
println("In get.")
if(n == N-1)
notifyAll()
}
}
val buf = new BoundedBuffer[Int](10)
spawn {
while(true)
buf.put(0);
}
spawn {
while(true)
buf.get;
}
}
은 put in 및 get과 동기화되어 예상대로 기능이 계속됩니다. 그러나 동기화에서 동기화를 제거하면 출력은
In put.
In put.
In get.
In get.
이 될 수 있습니다. 왜 결과가 이렇게 보이는지 설명 할 수 있습니까? 고마워.
이런 종류의 수수께끼 같은 행동은 왜 우리가 지금 훨씬 더 훌륭하게 (다루기 쉽고 오류가 적은) 경향이있는) 동시 및 분산 시스템 작성 도구. 나는 아카에 대해서 이야기하고있다. 동시 시스템을 작성하는 경우,이를 사용하는 것이 좋습니다. –