提交 9f462e58 编写于 作者: 梦境迷离's avatar 梦境迷离

Akka一些文章的修改,时间:2019-10-30 22:32:14

上级 7b0eb645
--- ---
title: Scala的Future异步工具解决 title: Scala的Future分析
categories: categories:
- Scala - Scala
tags: [Scala] tags: [Scala]
......
...@@ -29,8 +29,8 @@ description: 主要介绍Lightbend平台的Akka与Java内存模型的关系 ...@@ -29,8 +29,8 @@ description: 主要介绍Lightbend平台的Akka与Java内存模型的关系
通过Akka中的Actors实现,有两种方法可以让多个线程在共享内存上执行操作: 通过Akka中的Actors实现,有两种方法可以让多个线程在共享内存上执行操作:
* 如果一个消息被发送给一个参与者(例如由另一个actor)。在大多数情况下,消息是不可变的,但是如果消息不是构造正确的不可变对象,而没有“happens-before”规则,则接收方可能会看到部分初始化的数据结构,甚至可能是空值(Long/Double类型) * 如果一个消息被发送给一个Actor(例如由另一个actor)。在大多数情况下,消息是不可变的,但是如果消息不是构造正确的不可变对象,而没有“happens-before”规则,则接收方可能会看到部分初始化的数据结构,甚至可能是空值(Long/Double类型)
* 如果参与者在处理消息时更改其内部状态,并在稍后处理另一条消息时访问该状态。重要的是要认识到,对于Actor模型,您不能保证相同的线程将对不同的消息执行相同的actor。 * 如果Actor在处理消息时更改其内部状态,并在稍后处理另一条消息时访问该状态。重要的是要认识到,对于Actor模型,您不能保证相同的线程将对不同的消息执行相同的actor。
为了防止Actor的可见性和重新排序问题,Akka保证以下两个“happens before”规则: 为了防止Actor的可见性和重新排序问题,Akka保证以下两个“happens before”规则:
...@@ -38,15 +38,15 @@ description: 主要介绍Lightbend平台的Akka与Java内存模型的关系 ...@@ -38,15 +38,15 @@ description: 主要介绍Lightbend平台的Akka与Java内存模型的关系
* actor随后的处理规则:actor对一条消息进行处理,发生在同一actor处理下一条消息之前。 * actor随后的处理规则:actor对一条消息进行处理,发生在同一actor处理下一条消息之前。
注:用外行的术语来说,这意味着当actor处理下一条消息时,对actor内部字段的更改是可见的。因此,actor中的字段不一定是易失性的或等效的。 :用外行的术语来说,这意味着当actor处理下一条消息时,对actor内部字段的更改是可见的。因此,actor中的字段不一定是易失性的或等效的。
这两条规则只适用于同一个actor实例,如果使用不同的actor,则无效。 这两条规则只适用于同一个actor实例,如果使用不同的actor,则无效。
### Future与Java内存模型 ### Future与Java内存模型
在执行向其注册的任何回调之前,将完成“Future”的调用 Future的完成“happens before”对其注册的任何回调的调用被执行之前
我们建议不要关闭非最终字段(在Java中为Final,在Scala中为Val),如果做如果选择关闭非最终字段,则必须标记它们。易挥发以使该字段的当前值在回调中可见。 我们建议不要关闭非最终字段(在Java中为final,在Scala中为val),如果做如果选择关闭非最终字段,则必须标记它们。易挥发以使该字段的当前值在回调中可见。
如果在引用上关闭,还必须确保所引用的实例是线程安全的。我们强烈建议远离使用锁定的对象,因为它会带来性能问题,在最坏的情况下,会导致死锁。这就是同步的危险。 如果在引用上关闭,还必须确保所引用的实例是线程安全的。我们强烈建议远离使用锁定的对象,因为它会带来性能问题,在最坏的情况下,会导致死锁。这就是同步的危险。
...@@ -54,7 +54,7 @@ description: 主要介绍Lightbend平台的Akka与Java内存模型的关系 ...@@ -54,7 +54,7 @@ description: 主要介绍Lightbend平台的Akka与Java内存模型的关系
由于Akka在JVM上运行,仍然需要遵循一些规则。 由于Akka在JVM上运行,仍然需要遵循一些规则。
* 关闭内部Actor状态并将其公开给其他线程 * 关闭内部actor状态并将其暴露给其他线程
```scala ```scala
import akka.actor.{ Actor, ActorRef } import akka.actor.{ Actor, ActorRef }
...@@ -130,6 +130,9 @@ class MyActor(echoActor: ActorRef, cleanUpActor: ActorRef) extends Actor { ...@@ -130,6 +130,9 @@ class MyActor(echoActor: ActorRef, cleanUpActor: ActorRef) extends Actor {
* 讯息应不可变,这是为了避免共享可变状态陷阱。 * 讯息应不可变,这是为了避免共享可变状态陷阱。
更多Future可以参考本博客的“Scala的Future分析”
[programcreek中的例子](https://www.programcreek.com/scala/scala.concurrent.Future)
[文档](https://doc.akka.io/docs/akka/current/general/jmm.html) [文档](https://doc.akka.io/docs/akka/current/general/jmm.html)
* 使用搜狗翻译、百度翻译、谷歌翻译,仅供参考 * 使用搜狗翻译、百度翻译、谷歌翻译,仅供参考
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册