2017-12-04 3 views
1

私はAkkaライブラリを使用しています。範囲外のものにアクセスする俳優

複数のアクタがオブジェクトの関数を呼び出すとどうなりますか?これは、他のアクターがオブジェクトにアクセスすることを妨げますか?

私がこれを尋ねる理由は、ABCのアクターでJBCryptを使用したいからです。私たちは複数の文字列を同時に暗号化できるので、私は各アクターがJBcrypt.hash(...)を呼び出しています。スカラでは、オブジェクトは1つの場所に存在し、同じオブジェクト(ライブラリ)を使用する複数のアクタが実際に起こっている同時性をブロックするように思えるので、それがどのように機能するかはわかりません。

答えて

0

機能の実装方法によって異なります。関数が内部の変更可能な状態にアクセスし、スレッドの安全性を達成するために同期しようとすると、問題が発生します。それが純粋な関数であり、外部状態にアクセスしない場合、安全です。関数が変更可能な状態を持っている場合は、少なくとも自身に変更可能な状態を含まなければなりません。

2

,ThreadLocalまたはオブジェクトロックのような同時実行制御メカニズムを使用しない限り、ライブラリを呼び出すobjectの関数を呼び出す複数のアクターはブロックされません。

class BlockingPrinter(){ 
    def print(s: String) = synchronized{s} 
} 

object Printer{ 
    val printer = new BlockingPrinter() 

    def print(str: String) = printer.print(str) 
} 

しかしPrinter下のオブジェクトにそれを呼び出して要約するとは限らない

class NonBlockingPrinter(){ 
    def print(s: String) = s 
} 

object Printer{ 
    val printer = new NonBlockingPrinter() 

    def print(str: String) = printer.print(str) 
} 

を、あなたがしているライブラリを:Printer下のオブジェクトにprintの呼び出しはブロックされます例えば

、呼び出しは、並行処理の処理方法を決定するものです。あなたがオブジェクトを呼んでいるという事実ではありません。