在将来的代码中使用synchronized/locks

mis*_*tor 6 java concurrency scala akka playframework-2.0

我们正在使用Scala,Play框架和MongoDB(使用ReactiveMongo作为我们的驱动程序)构建Web应用程序.应用程序架构是端到端的非阻塞.

在我们代码的某些部分,我们需要访问一些非线程安全的库,例如Scala的解析器组合器,Scala的反射等.我们目前正在用synchronized块封闭这些调用.我有两个问题:

  1. 使用synchronizedfuture-y代码时是否有任何需要注意的问题?
  2. 从性能和可用性的角度来看,使用锁(例如ReentrantLock)而不是使用锁是否更好synchronized

vit*_*lii 8

这是一个老问题))在这里看到使用-actors-instead- for -synchronized作为例子.简而言之,使用actor而不是lock更合适:

class GreetingActor extends Actor with ActorLogging {

  def receive = {
    case Greeting(who) ? log.info("Hello " + who) 
  }
}
Run Code Online (Sandbox Code Playgroud)

在任何给定的时间只会处理一条消息,因此您可以放置​​任何非线程安全的代码而不是log.info,一切正常.BTW使用ask模式,您可以将您的演员无缝集成到需要未来的现有代码中.


Chr*_*unt 2

您提到的示例(即反射和解析)应该是相当不可变的,并且您不需要锁定,但是如果您要使用锁,那么同步块就可以了。我认为使用同步与使用锁之间没有太大的性能差异。