Java高并发高性能编程(多线程,协程,Actor,RxJava、Akka、Reactor)

Akka手册译(一)——Akka和Java内存模型

2017-01-01  本文已影响0人  儿哥欠三百首

使用Lightbend平台的主要好处,包括Scala和Akka,它简化了编写并发软件的过程。本文讨论如何Lightbend平台,尤其是Akka,并发应用程序共享内存的方法。

Java内存模型

在Java 5之前,Java内存模型(JMM)有误的定义。由多个线程访问共享内存时可以得到各种奇怪的结果,如:

Actor和Java内存模型

Akka中Actor的实现,有两种方法在共享内存环境下执行多线程行为:

注意
通俗的讲改变Actor的内部字段在下一个消息的可见。Actor中的字段不能是易失或相价的。

两个规则仅适用于同一个Actor实例,对不同的Actor无效。

Futures和Java模型

完成Feature的“发生前”执行调用的回调注册。

我们建议不要封闭非final字段(在Java用final,在Scala中用val )如果你选择封闭非final字段,它们必须被标识为‘volatile’为了字段的当前值是可见的回调。

如果封闭一个引用,需要确保实例是线程安全的。我们强烈建议远离使用锁定的对象,因为它在最坏的情况下,引入性能问题和死锁。这样的同步是危险的。

Actor和共享可变状态

由于Akka运行在JVM上仍有一些规则要遵循。

1. class MyActor extends Actor {
2. var state = ...
3. def receive = {
4.    case _ =>
5.      //Wrongs
6. 
7.    // Very bad, shared mutable state,
8.    // will break your application in weird ways
9.      Future { state = NewState }
10.      anotherActor ? message onSuccess { r => state = r }
11. 
12.    // Very bad, "sender" changes for every message,
13.    // shared mutable state bug
14.      Future { expensiveCalculation(sender()) }
15. 
16.      //Rights
17. 
18.    // Completely safe, "self" is OK to close over
19.    // and it's an ActorRef, which is thread-safe
20.      Future { expensiveCalculation() } onComplete { f => self ! f.value.get }
21. 
22.    // Completely safe, we close over a fixed value
23.    // and it's an ActorRef, which is thread-safe
24.      val currentSender = sender()
25.      Future { expensiveCalculation(currentSender) }
26. }
27.}

上一篇
下一篇

上一篇下一篇

猜你喜欢

热点阅读