13 concurrency scala future callback akka
我在Akka docs中找到了:
在使用未来的回调时,例如onComplete,onSuccess和onFailure,你需要小心避免关闭包含actor的引用,即不要在回调中调用方法或访问封闭actor上的可变状态.
那么这是否意味着我应该总是使用future pipeTo self然后调用一些函数?或者我仍然可以使用方法回调,那么我应该如何避免并发错误呢?
mon*_*ack 12
这意味着:
class NotThreadSafeActor extends Actor {
import context.dispatcher
var counter = 0
def receive = {
case any =>
counter = counter + 1
Future {
// do something else on a future
Thread.sleep(2000)
}.onComplete {
_ => counter = counter + 1
}
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,actor的receive方法和Future的onComplete都会更改可变变量counter.在这个玩具示例中,它更容易看到,但Future调用可能是嵌套方法,同样捕获可变变量.
问题是onComplete调用可能在与actor本身不同的线程上执行,因此完全可以让一个线程执行receive而另一个执行,onComplete从而为您提供竞争条件.这首先否定了演员的观点.
| 归档时间: |
|
| 查看次数: |
5397 次 |
| 最近记录: |