【问题标题】:Barriers in javaJava中的障碍
【发布时间】:2013-11-20 23:29:43
【问题描述】:

在 c++ 中访问std::atomics 时,我可以使用memory_order_acquirememory_order_releasestd::atomics::load()std::atomics::store() 部分削弱订单保证。或使用std::memory_order_relaxed

我的问题是:这在 java 中可能吗?我的意思是Java中有任何障碍概念吗?


如果我的想法非常错误,请纠正我。

【问题讨论】:

标签: java c++ concurrency atomic memory-barriers


【解决方案1】:

Java concurrent package 应该有您需要的所有工具,包括 CyclicBarrier 和 Phaser(可重复使用的屏障)。

在任何调用 volatile 变量时,Java 中的正确内存顺序都得到保证,涉及之前发生的任何事情。由于这些屏障在内部使用 volatile 变量,因此在每次 barrier.await() 调用之后也可以保证内存顺序。

对于更细粒度的顺序,您需要使用自己的 volatile 变量,但在给定标准编码(阅读:不是重新发明轮子,而是使用 Java 库)的情况下,几乎没有理由实际这样做这个。

【讨论】:

    【解决方案2】:

    是的,Java 并发确实允许某种闩锁或屏障。看看CountDownLatchCyclicBarrier

    这两个都是以固定数量的线程创建的,作为构造函数参数传递。当有足够多的线程await() 这个屏障时,它将为所有线程释放。

    【讨论】:

      【解决方案3】:

      不确定我是否有此权利,但快速扫描C++11 memory_order_acquire and memory_order_release semantics? 表明您可能正在寻找:

      volatile variable;
      

      有关volatile 等的更多信息,请参阅Volatile Vs Static in java

      【讨论】:

      猜你喜欢
      • 2014-09-07
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 2015-04-15
      相关资源
      最近更新 更多