6

Scala、Play フレームワーク、および MongoDB (ドライバーとして ReactiveMongo を使用) を使用して Web アプリを構築しています。アプリケーション アーキテクチャは、エンド ツー エンドでノンブロッキングです。

コードの一部では、Scala のパーサー コンビネーターや Scala のリフレクションなど、スレッドセーフではないライブラリにアクセスする必要があります。現在、そのような呼び出しをsynchronizedブロックで囲んでいます。2 つの質問があります。

  1. synchronizedfuture-y コードを使用する際に注意すべき点はありますか?
  2. パフォーマンスと使いやすさの両方の観点から、ReentrantLockよりもロック ( など) を使用する方が良いですか?synchronized
4

4 に答える 4

8

This is an old question)) see here using-actors-instead-of-synchronized for example. In short it would be more advisable to use actors instead of locks:

class GreetingActor extends Actor with ActorLogging {

  def receive = {
    case Greeting(who) ⇒ log.info("Hello " + who) 
  }
}

only one message will be processed at any given time, so you can put any not-thread safe code you want instead of log.info, everything will work OK. BTW using ask pattern you can seamlessly integrate your actors into existing code that requires futures.

于 2013-07-24T07:00:51.363 に答える
2

最も簡単で安全な方法は (できれば) Thread Confinementからだと思います。つまり、各スレッドはパーサー コンビネーターなどの独自のインスタンスを作成し、それを使用します。

また、同期が必要な場合(トラフィックが不足しているため回避する必要があります)、synchornizedまたはReentrantLockほぼ同じパフォーマンスが得られます。これもまた、どのオブジェクトをどのロックなどで保護する必要があるかによって異なります。Web アプリケーションでは、絶対に必要でない限り、推奨されません。

于 2013-07-24T07:27:50.570 に答える
2

あなたが言及した例、つまりリフレクションと解析は合理的に不変である必要があり、ロックする必要はありませんが、ロックを使用する場合は同期ブロックで十分です。同期とロックの使用にパフォーマンスの違いはあまりないと思います。

于 2013-07-24T07:00:04.883 に答える