2011-10-14 4 views

답변

18

액터 모델이 각 액터 인스턴스가 자신의 사서함을 순차적으로 처리한다고 가정하기 때문일 수 있습니다. 즉, 두 개 이상의 동시 스레드가 단일 액터 인스턴스의 코드를 실행한다는 것은 결코 일어나지 않아야한다는 것을 의미합니다. 기술적으로 당신은 액터의 클래스에서 메소드를 생성 할 수 있습니다 (여전히 객체이기 때문에). 그리고 동시에 여러 스레드에서 그것을 호출 할 수 있습니다. 그러나 이것은 액터의 사용 규칙에서 크게 벗어 났을 것이므로 "스스로 위험을 감수해야합니다" 왜냐하면 그 모델의 모든 thread-safety 보장을 잃을 것이기 때문입니다.

이것은 Akka가 메시지 전달을 통해 액터와 통신 할 수있게 해주는 핸들 인 ActorRef이라는 개념을 도입했으나 직접 메서드를 호출하지 않은 이유 중 하나이기도합니다.

+0

감사합니다. Przemek. 그건 설명해. –

4

나는 우리가 꽤 잘 문서화 생각 : http://doc.akka.io/docs/akka/2.3.9/general/jmm.html

+0

그 문서를 여러 번 읽었습니다. 나는 JVM 초보자이다. 내 이해에서, '전에 발생합니다'는 '가시성'을 입증합니다. 중요한 섹션에서 여러 스레드로 인해 문제가 발생할 수 있습니다. –

+3

Akka는 사서함을 한 번만 실행하도록 예약하여 동시에 동일한 액터에 대해 메시지를 실행하지 못하도록합니다. (실행 예정인지 아닌지). Mailbox Runnable을 만들면 새로운 실행 파일을 할당하는 것을 피할 수있을뿐만 아니라 간단한 CAS 작업을 통해 사서함을 한 번만 실행하도록 예약 할 수 있으므로 추가 저장 작업이 필요하지 않습니다. 스레드는 동시에 동일한 사서함을 처리하지 않습니다. –

+0

굉장한 설명. 이것은 분명히 나를 더 읽는 데 도움이 될 것입니다. 하나의 질문이지만 어떻게하면 http://akka.io/docs/akka/1.2/general/jmm.html에서 메일 박스의 '상호 배타적 인 처리'를 유도 할 수 있습니까? –

2

배우 'Treadsafe'이다. Actor System (AKKA)은 각 배우에게 자체 경량 스레드를 제공합니다. 이것은 트레드가 아니라 AKKA 시스템이 액터가 개발자 자신의 스레드에서 항상 실행되고 있다는 인상을줍니다. 즉, 메시지를 처리 ​​한 결과로 수행 된 모든 작업은 모든 목적에 대해 스레드로부터 안전합니다.

그러나 변경 가능한 메시지 또는 공개 상태를 사용하여 AKKA를 훼손해서는 안됩니다. 액터가 독립 실행 형 기능 단위로 개발되면 스레드 안전성이 보장됩니다.

은 참조 : http://doc.akka.io/docs/akka/2.3.12/general/actors.html#State

하고보다 심층적 인 AKKA 메모리 모델의 연구와 어떻게 '트레드'문제를 관리하기위한 http://doc.akka.io/docs/akka/2.3.12/general/jmm.html.