【问题标题】:Make a B+ Tree concurrent thread safe使 B+ 树并发线程安全
【发布时间】:2015-09-21 02:56:36
【问题描述】:

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

【问题讨论】:

  • 如何确定节点何时变为 maxFilled - 1,因为当节点尚未处于此状态时,多个线程可以开始写入?
  • @KubaWyrostek 因为我会将数组锁定在当前叶节点中(因此最多一个线程可以在同一个叶节点上运行)。总是可以只有一个反向传播。嗯,但是是的,两片叶子可能同时分裂,这会导致父级出现问题..所以我需要另一个解决方案吗?

标签: java multithreading b-tree


【解决方案1】:

你可以实现一个lock-free version of a B-tree.

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

详细信息已在论文中详细记录,在这里复制它们毫无意义。这张图(取自论文)显示了好处:

【讨论】:

  • 非常好的知识分享。
猜你喜欢
  • 2021-07-12
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多