Java 做一个B+;树并发线程安全

Java 做一个B+;树并发线程安全,java,multithreading,b-tree,Java,Multithreading,B Tree,我已经用Java实现了一个B+树。现在我想知道什么是允许并发插入的最佳方式。我的想法是锁定一个节点,如果它是maxFilled-1(这意味着拆分事件已关闭)。否则我会在轮班时锁定阵列。但这种方式可能会锁定非常靠近根的节点,因此也会锁定过多的子节点。对于如何使B+树线程安全,有更好的方法或最佳实践吗?您可以实现 这种方法会使需要拆分的节点逐渐标记为冻结(通过使用原子比较和交换操作将节点中的各个条目逐个标记为冻结,直到完全冻结)。 读卡器可以在到达树的其他部分的过程中继续浏览部分/完全冻结的节点,从

我已经用Java实现了一个B+树。现在我想知道什么是允许并发插入的最佳方式。我的想法是锁定一个节点,如果它是maxFilled-1(这意味着拆分事件已关闭)。否则我会在轮班时锁定阵列。但这种方式可能会锁定非常靠近根的节点,因此也会锁定过多的子节点。对于如何使B+树线程安全,有更好的方法或最佳实践吗?

您可以实现

这种方法会使需要拆分的节点逐渐标记为冻结(通过使用原子比较和交换操作将节点中的各个条目逐个标记为冻结,直到完全冻结)。 读卡器可以在到达树的其他部分的过程中继续浏览部分/完全冻结的节点,从而确保读卡器的高并发性。 一个完全冻结的节点被替换,然后被垃圾收集,这在具有垃圾收集功能的Java中很好地工作

详细情况在文件中有很好的记录,在这里复制它们是没有意义的。此图(摘自论文)显示了以下优点:


由于多个线程可以在节点尚未处于此状态时开始写入,因此如何确定节点何时变为maxFilled-1?@KubaWyrostek,因为我会将数组锁定在当前叶节点中(因此最多一个线程可以在同一叶节点上操作)。始终只能有一个反向传播。嗯,但是是的,两片叶子可能同时裂开,这会在父母身上造成问题。。所以我需要另一个解决方案,对吗?非常好的知识共享。