关于我在java中读取volatile关键字的应用,我真的很困惑.
以下陈述是否正确?"在对同一字段的每次后续读取之前发生对易失性字段的写入"
理想情况下应该使用volatile关键字吗?
有什么区别:
class TestClass
{ private int x;
synchronized int get(){return x;}
synchronized void set(int x){this.x = x;}
}
Run Code Online (Sandbox Code Playgroud)和
class TestClass
{ private volatile int x;
int get(){return x;}
void set(int x){this.x = x;}
}
Run Code Online (Sandbox Code Playgroud) 这个问题看起来类似于我的Scala actor的属性应该标记为@volatile吗?但不确定答案是否相同.
例如,如果配置了fork-join调度程序并且actor的状态没有被@volatile标记,那么是否保证actor的状态将通过缓存层次结构从一个核心(或处理器)传播到另一个核心(或处理器)/join工作线程在不同的核心(或处理器)上运行?
PS JSR133之后只有一个写入/读取操作到/从任何易失性变量执行刷新缓存到主内存并在其他核心(或处理器)上运行的其他线程上看到来自此线程的所有前面的非易失性写入,这是正确的吗?如果是,则可以回答,因为扫描工作队列会执行一些读数并从/向FJ任务的volatile变量写入.
我被告知(Scala)Actors实际上从不实际执行两个操作,这表明该行为(或反应?或接收?)方法本质上是同步的.我知道一个act方法中的长操作会导致阻塞问题,我认为必须以某种方式同步对消息队列的访问......但是......
建议的是,接收消息告诉它增加内部计数器的actor将以线程安全的方式递增计数器.不会同时处理两条更新消息,因此没有两条消息可以同时尝试更新计数器.
演员中的计数器属性听起来像"共享状态".
这样的操作是完全线程安全的吗?如果是这样,演员如何以一种有效的方式使用多个核心机器?演员如何多线程?
如果没有,那么以线程安全方式计算消息而不需要某些synchronized/volatile变量的适当惯用方法是什么?