scala – @volatile usage不清楚 – 将带有`var`的对象发送到另
我不确定我在这里正确使用@volatile.我有一个缓冲区,像这样:
final class BufD(val buf: Array[Double],@volatile var size: Int) 哪个在进程之间发送,从而可能跨越线程边界.发送者可以在发送之前更新大小字段.因此,我想确保接收器在任何情况下都不能在这里看到过时的尺寸值.第一个问题:@volatile确保这个或者它是多余的吗? 现在我介绍一个特点: trait BufLike { @volatile var size: Int } final class BufD(val buf: Array[Double],@volatile var size: Int) extends BufLike 这给了我一个编译器警告:
第二个问题:我应该在这里删除@volatile还是以不同的方式更改它? 解决方法
我假设线程A创建,更新,然后将对象-X传递给线程-B.如果对象-X及其直接或可传递的任何内容(字段)没有被线程A进一步更新,则volatile是多余的. JVM保证接收线程的object-X状态的一致性.
换句话说,如果object-X的逻辑所有权从线程A传递到线程B,那么volatile就没有意义.相反,在现代多核系统中,volatile的性能影响可能大于不可变案例类留下的线程局部垃圾. 如果object-X应该被共享用于写入,那么使字段volatile将有助于共享其值,但是您将面临另一个问题:如果字段的值彼此依赖,则对象-X上的非原子更新. 正如@alf指出的那样,为了从事先发生的保证中受益,必须安全地传递对象!这可以使用java.util.concurrent.**类来实现.像Akka这样的高级构造定义了他们自己“安全地”传递对象的机制. 参考文献: https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |