Scala中object定义的工具函数可否被多线程或Akka Actor同时调用
结论
你给出的Util工具类的isName方法可以完全安全地被多线程或者多个Akka Actor同时调用,不存在任何线程安全问题。
具体原因
- Scala的
object是天然的线程安全单例,它的初始化过程由JVM类加载机制保障,所有线程访问到的都是完全初始化的实例,不会出现半初始化的异常状态。 - 代码中
names是val修饰的不可变引用,指向的是Scala默认提供的scala.collection.immutable.Set不可变集合,本身不支持内容修改,所有访问都是只读操作,天然适配并发场景。 isName方法的执行逻辑没有任何副作用:入参String是不可变类,toLowerCase调用只会生成新的字符串实例,contains调用只会读取不可变集合的固定内容,全程没有修改任何共享可变状态,不存在竞态条件。- 针对Akka Actor场景也完全适配:Actor的任务最终是在线程池的工作线程上执行,只要被调用的方法本身没有线程安全问题,就不需要做额外的同步处理。
注意:如果后续调整代码时把
names改成指向可变集合,或者在方法中增加对共享可变变量的修改操作,就需要额外引入同步机制保障线程安全。
内容的提问来源于stack exchange,提问作者Liam Bohl
相关产品推荐
相关产品推荐

