加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – @volatile usage不清楚 – 将带有`var`的对象发送到另

发布时间:2020-12-16 09:51:26 所属栏目:安全 来源:网络整理
导读:我不确定我在这里正确使用@volatile.我有一个缓冲区,像这样: final class BufD(val buf: Array[Double],@volatile var size: Int) 哪个在进程之间发送,从而可能跨越线程边界.发送者可以在发送之前更新大小字段.因此,我想确保接收器在任何情况下都不能在这里
我不确定我在这里正确使用@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

这给了我一个编译器警告:

Warning:(6,4) no valid targets for annotation on method size – it is discarded unused. You may specify targets with meta-annotations,e.g. @(volatile @getter)

06002

第二个问题:我应该在这里删除@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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读