2011-10-14 17 views

Odpowiedz

18

Jest tak prawdopodobnie dlatego, że model aktora zakłada, że ​​każda instancja aktora przetwarza sekwencyjnie swoją skrzynkę pocztową. Oznacza to, że nigdy nie powinno się zdarzyć, że dwa lub więcej współbieżnych wątków wykonuje kod instancji pojedynczego aktora. Technicznie możesz stworzyć metodę w klasie aktora (ponieważ wciąż jest to obiekt) i jednocześnie wywoływać ją z wielu wątków, ale byłoby to poważne odejście od reguł użycia aktora i zrobiłbyś to "na własne ryzyko", ponieważ wtedy straciłbyś wszystkie gwarancje bezpieczeństwa tego modelu.

Jest to również jeden z powodów, dla których Akka wprowadziła pojęcie ActorRef - uchwyt, który pozwala komunikować się z aktorem poprzez przekazywanie wiadomości, ale nie poprzez bezpośrednie wywoływanie jego metod.

+0

Dzięki Przemek. To wyjaśnia. –

4

Myślę, że mamy go dość dobrze udokumentowane: http://doc.akka.io/docs/akka/2.3.9/general/jmm.html

+0

Przeczytałem ten dokument wiele razy. Jestem nowicjuszem JVM; w moim rozumieniu "dzieje się wcześniej" tylko uzasadnia "widoczność". Nadal możemy mieć problemy z powodu wielu wątków w sekcji krytycznej. –

+3

Akka zabezpiecza przed uruchomieniem wiadomości dla tego samego aktora w tym samym czasie, dopuszczając tylko jeden raz do zaplanowania wykonania skrzynki pocztowej. (albo to jest zaplanowane do wykonania, albo nie jest). Uruchamiając skrzynkę pocztową, nie tylko unikamy przydzielania nowych runnables, ale możemy również, poprzez prostą operację CAS, zapewnić, że skrzynka pocztowa jest kiedykolwiek zaplanowana do wykonania tylko raz, co oznacza, że ​​nie jest wymagane dodatkowe księgowanie, aby upewnić się, że 2 wątki nie przetwarzają tej samej skrzynki pocztowej w tym samym czasie. –

+0

Niesamowite wytłumaczenie. To na pewno pomoże mi w dalszym czytaniu. Jedno pytanie, jak mogłem wydedukować "wzajemnie wyłączne przetwarzanie" skrzynki pocztowej z http://akka.io/docs/akka/1.2/general/jmm.html? –

2

Aktorzy są 'Treadsafe'. The Actor System (AKKA), zapewnia każdemu aktorowi swoją "lekką nić". Oznacza to, że nie jest to bieżnik, ale system AKKA sprawi wrażenie, że aktor zawsze działa w swoim wątku dla programisty. Oznacza to, że wszelkie operacje wykonywane w wyniku działania na wiadomości są dla wszystkich celów bezpieczne.

Nie należy jednak podważać AKKA za pomocą komunikatów o zmiennym brzmieniu lub stanu publicznego. Jeśli rozwiniesz swoich aktorów, aby byli samodzielnymi jednostkami funkcjonalności, będą one bezpieczne dla wątków.

Zobacz także: http://doc.akka.io/docs/akka/2.3.12/general/actors.html#State

i http://doc.akka.io/docs/akka/2.3.12/general/jmm.html bardziej dogłębnego studium modelu pamięci AKKA i sposobu zarządzania kwestiami „bieżnik”.

Powiązane problemy