使 B+ 树并发线程安全

Make a B+ Tree concurrent thread safe

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

您可以实施 lock-free version of a B-tree.

这种方法会导致需要拆分的节点逐渐标记为冻结(通过原子比较和交换操作将节点中的各个条目逐个标记为冻结,直到完全冻结)。 读者可以继续在 partially/fully 冻结节点导航到树的其他部分,确保读者的高并发性。 一个完全冻结的节点被替换,然后进行垃圾收集,这与具有垃圾收集功能的 Java 配合得很好。

论文中详细记录了详细信息,没有必要将它们全部复制到此处。这张图(摘自论文)显示了好处: