【问题标题】:Any papers on bitmask-widening?有关于位掩码扩展的论文吗?
【发布时间】:2017-11-02 09:19:24
【问题描述】:

我需要一个位掩码,它可以超过 64 位,可以由 Java 原子操作。

“明显”的候选者(两者都需要引入某种锁定方案)是:

  • 重新分配为固定大小的连续区域
  • 由链接字组成的断裂位掩码(“线程安全BitSet”)

有没有关于这个问题的论文? (不必是特定于 Java 的。)

【问题讨论】:

  • 如果使用longs 的数组会怎样?为特定位找到正确的long 真的必须通过翻转/检查该位是原子的吗?我无法想象一个重要的用例。如果一个位的检查/翻转是原子的,那么想要接触同一个位的两个线程将执行相同的计算来确定该位的位置,然后才尝试执行原子动作。有问题吗?
  • @Malt 一个“longs 数组”基本上是“作为固定大小的连续区域重新分配”。并且您假设位掩码操作仅更改一个位。但是,我可能必须翻转多个,并且所有这些都应该在同一个原子操作中翻转。或者我可能需要检查位于不同longs 中的位,检查应该是原子操作。
  • @User1291 使用longs 的数组并使用锁来实现原子性是否存在问题?我不知道任何关于这方面的论文,我无法想象如果有的话他们会涵盖什么,这对我来说听起来很简单。
  • @xtratic 好吧,“使用锁实现原子性”主要是问题所在。太贵。而且我不知道是否有人没有检查过 longs 数组提供的空间局部性是否值得扩大复制开销。

标签: java memory-management synchronization locking bitmask


【解决方案1】:

根据您的说明,您似乎真正需要的是有关在 Java 中编写“原子”操作的方法的论文。

对于您想做的事情,我想不出避免使用锁的方法。毕竟,即使只是writing to a long or double is not atomic without synchronization

这里有一些与你想做的事情相关的链接:

您应该根据您对该数据结构的预期用例确定要使用哪种锁定机制。

https://blog.takipi.com/java-8-stampedlocks-vs-readwritelocks-and-synchronized/

另外,有些人可能会抱怨过早的优化,但我也喜欢在代码的效率成为问题之前考虑它。然而,在这种情况下使用同步/锁可能没有你想象的那么糟糕。


如果你想要更低的级别,那么我会求助于JNI

但是,无论你走多低级,我认为使用锁/同步仍然是不可避免的,因为 不能保证硬件会有指令可以原子地执行你想要的操作。 CPU 以原子方式跨多个单词执行or 操作?

附带说明,如果您要大量使用这些位掩码并希望获得最高性能,那么可能可能值得为 GPU 编写此代码。虽然我不完全确定利弊,但这些将留待进一步研究......

我认为您正在寻找硬件目前无法提供的效率水平。

【讨论】:

  • 感谢您写下所有这些。然而,作为对 Java 并发性的一般介绍,这更让我印象深刻。我正在寻找更多“低级”的东西。我正在处理的位掩码已经是锁定方案的一部分,我们正处于触发状态,我们质疑插入的每一个新内存屏障。现在,正在使用 long 类型的位掩码,因为 64 位是您可以同时使用的最多 CAS 并且我们希望尽可能便宜地保留我们替换它的内容。(理想情况下,我们会设法得到intel tsx 可以在没有代价高昂的 Java 回调不安全的情况下工作,但到目前为止还没有运气。)
  • @User1291 更新了我的回复。不幸的是,我认为您要求的是不可能的,但我仍然希望我回答了您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
相关资源
最近更新 更多