use*_*mda 5 java thread-safety akka
我有一个非单身演员正在创建一个我想只创建一次的对象.这是如何实现的?演员可以单身吗?如果有,怎么样?
class NonSingletonActor extends UntypedActor {
public static onReceive(Object arg) throws Exception {
*block of code that needs to be executed once!*
} }
Run Code Online (Sandbox Code Playgroud)
一个AtomicBoolean是为这个伟大的,特别是它的compareAndSet方法.该方法有两个参数:"预期"值和新值.它原子地做三件事:(a)检查当前值是否等于期望值,(b)如果是,则将当前值更新为新值,(c)如果更新发生则返回true(即,如果预期值和旧值相同).
private static final AtomicBoolean hasRun = new AtomicBoolean(false);
...
if (hasRun.compareAndSet(false, true)) {
// your code here
}
Run Code Online (Sandbox Code Playgroud)
此代码将检查是否hasRun具有"false"值(这是其初始状态).如果是这样,它会将自己设置为"true"并运行if阻止; 否则,它将保持当前状态而不会运行if阻止.至关重要的是,check-and-set是原子的(正如类名所暗示的那样),这意味着没有两个线程可以同时看到错误的值; 其中一个将看到false值并将其设置为true,而其他线程无法在这两个操作之间"潜入".
这些其他答案似乎忽略了这样一个事实:您的问题是在 Akka actor 的上下文中提出的。
\n\n如果您有一个需要从多个参与者引用但只创建一次的对象,则应该将这些操作委托给另一个参与者\xe2\x80\x94,该参与者将创建和管理相关对象\xe2\x80\x94,然后分享对该演员的参考。
\n\n当一个NonSingletonActor需要对该对象进行操作时,它将向包含该对象的 actor 发送一条消息。我非常犹豫是否要将 Akka 与此处显示的其他解决方案混合使用,我希望您会看到一些意想不到的行为。
| 归档时间: |
|
| 查看次数: |
924 次 |
| 最近记录: |