从范围

时间:2017-12-04 22:38:36

标签: scala akka actor

我正在使用Akka库。

当多个actor调用对象上的函数时会发生什么?这会阻止其他演员访问该对象吗?

我问这个的原因是因为我想将JBCrypt与akka演员一起使用。因为我们可以同时加密多个字符串,所以每个actor都调用JBcrypt.hash(...)。不知道它是如何工作的,因为我认为,在scala中,对象存在于一个地方,我觉得使用相同对象(库)的多个actor可能会阻止实际发生的并发。

2 个答案:

答案 0 :(得分:2)

调用库的object中调用函数的多个actor不会阻塞,除非被调用的库使用sychronizedThreadLocal或对象锁等并发控制机制。

例如,在下面print对象上调用Printer将阻止:

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)
}

总之,您调用的库是决定如何处理并发的库。不是你正在调用一个对象。

答案 1 :(得分:0)

这取决于功能的实现方式。如果函数访问了一些内部可变状态并尝试同步以实现线程安全,则存在问题。如果它是纯函数并且不访问任何外部状态,那么它是安全的。如果函数至少具有可变状态,则它必须包含自身的可变状态。