2013-04-06 14 views
10

, onlar reddeder:Akka, JMM benzeri olay öncesi ilişkiyi nasıl uygular? Resmi Akka doc olarak

aktörler üzerinde görünürlük ve yeniden sıralama sorunlarını önlemek için, Akka aşağıdaki iki kural "önce olur" garanti:

aktör kuralı gönderin: ait send Bir aktöre mesaj, o mesajın aynı oyuncu tarafından alınmasından önce olur. Aktör sonraki işlem kuralı: Bir mesajın işlenmesi aynı aktör tarafından bir sonraki mesajın işlenmesinden önce gerçekleşir.

Ayrıntılar için lütfen the doc numaralı telefonu kullanın.

Akka'nın bunu nasıl gerçekleştirdiğini merak ediyorum. Sadece kaynak koddan geçtim (şu anda en son) ve Actor.receive'u çalıştırmadan önce bir Lock olması gerektiğini düşündüm, ama herhangi bir kilit bulamadım (sanırım). Son olarak, ActorCell.invoke için bir yorum bulundu:

// Bellek tutarlılık sonra sanırım posta kutusu durumunu

Evet, Mailbox.status yazma (iletilerini işleme sonra posta kutusu durumunu okuyarak Kutusuna tarafından işlenir Bu, status alanına erişmek/güncellemek için Unsafe kullandığını gördü, ancak bunun bellek görünürlüğünü nasıl sağlayacağını anlayamadım ..

cevap

13

Göz önünde bulundurulması gereken iki nokta var: m Aktörün iç durumunu özümsemek ve doğru bir şekilde yayınlamak.

Birincisi, posta kutusunun MessageQueue uygulaması tarafından gerçekleştirilir; bu, uçucu yazmaları (varsayılan ConcurrentLinkedQueue için) veya kilitlenen öğenin güvenli bir şekilde yayınlanmasını sağlamak için (normal bir LinkedBlockingQueue için) kilitler kullanır. Aktör, aynı uçucu alanları (ilk durumda) okuyarak veya aynı kilitleri (ikinci) alarak gönderici ile senkronize olacaktır, dolayısıyla, mesaj gönderilmeden önce tüm mesajlar, o mesajın işlenmesinde aktör içindeki herhangi bir şeyden önce gerçekleşir. .

aktörün iç durumudur güvenle o posta kutusu durumuna göre farklı bir iş parçacığı üzerinde zamanlanacağını Bulduğunuz bile uzak istiflenmesi: posta kutusu “planlanmamış şekilde ayarlanmıştır (throughput parametresi tarafından tanımlanan) iletileri toplu işledikten sonra “Uçucu bir yazım olan durum (aslında aynı semantiklere sahip Unsafe.compareAndSetInt()). Aktör, mesajları işlemeye başlamadan önce, bir önceki yazıyla senkronize olan Unsafe.getIntVolatile'u kullanarak posta kutusu durumunu okur, dolayısıyla, bu toplu işlem sırasında tüm okumalardan önce gerçekleşen mesajların son partisi sırasında tüm yazar tarafından yazılan tüm yazılar yazar.

Sen operasyonların semantik hakkında daha fazla bilgi bulabilirsiniz sun.misc.Unsafe üzerinde *Volatile yöntemleri Atomic*Reference aynıdır kurallara uyarlar akılda tutarak, here içeriyordu.

+0

Bu actor'un dahili durumları Mailbox.status tarafından korunan anlamına mı geliyor? Evet, –

+0

evet, kesinlikle. –

+0

Teşekkürler Roland! AbstractQueuedSynchronizer'ı inceleyerek, sonunda bunu anlıyorum. –