volatile - 为什么akka.net IActorRef.Tell(),message参数的字段不需要是volatile的?
问题描述
为什么学习akka.net,我在调用IActorRef.Tell时释放,参数的字段不需要是volatile
public class Model{
public volatile string Name;
}
在以下示例中,Name 属性不需要是易变的。
using System;
using Akka.Actor;
namespace WinTail
{
class Program
{
public static ActorSystem MyActorSystem;
static void Main(string[] args)
{
// make an actor system
MyActorSystem = ActorSystem.Create("MyActorSystem");
// make our first actors!
IActorRef consoleWriterActor = MyActorSystem.ActorOf(Props.Create(() => new ConsoleWriterActor()),
"consoleWriterActor");
Model model = new Model();
model.Name = "jack";
model.Name = "tom";
// tell console reader to begin
consoleReaderActor.Tell(model);
Console.ReadLine();
}
}
public class Model{
public string Name;
}
}
解决方案
volatile
关键字表示一个字段可能被多个线程修改。因为消息不变性是设计基于参与者的系统时的关键原则之一,所以不需要 volatile 修饰符,因为消息应该是不可变的。为了安全起见,您需要将您的更改Model
为不可变的。
推荐阅读
- flutter - Flutter - 文本小部件更新一次迭代太晚了
- flutter - 显示从 TimePicker 中选择的时间以在 Flutter App 中显示本地通知
- android - 尝试写入文件时如何解决 Flutter 错误:“OS 错误:不允许操作,errno = 1”?
- proc-sql - SQL:有没有办法在同一个 SELECT 语句中使用新的/用户定义的变量?
- android - 想知道继续以下 Rx 链的最佳方式是什么,我需要决定调用 flatmap 还是 switchmap?
- html - 为什么文本会超出 div 容器?
- visual-studio-code - 调试控制台出错时跳转到链接的快捷方式是什么?
- python - 将值插入目录路径的字符串中不起作用
- azure - 为什么我的应用无法与 azure 应用服务上的 websocket 通信?
- sql-server - 在 DBeaver (MAC) 上为 SQL Server 连接本地主机