我正在使用Akka库。
当多个actor调用对象上的函数时会发生什么?这会阻止其他演员访问该对象吗?
我问这个的原因是因为我想将JBCrypt与akka演员一起使用。因为我们可以同时加密多个字符串,所以每个actor都调用JBcrypt.hash(...)。不知道它是如何工作的,因为我认为,在scala中,对象存在于一个地方,我觉得使用相同对象(库)的多个actor可能会阻止实际发生的并发。
答案 0 :(得分:2)
调用库的object
中调用函数的多个actor不会阻塞,除非被调用的库使用sychronized
,ThreadLocal
或对象锁等并发控制机制。
例如,在下面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)
这取决于功能的实现方式。如果函数访问了一些内部可变状态并尝试同步以实现线程安全,则存在问题。如果它是纯函数并且不访问任何外部状态,那么它是安全的。如果函数至少具有可变状态,则它必须包含自身的可变状态。