【发布时间】:2019-01-05 23:59:26
【问题描述】:
在用 Java 编写 BST 的多线程实现时,我遇到了以下问题。此 BST 不应该使用全局锁,而是尽可能少地锁定,特别是只锁定正在更改的节点(添加和删除命令)。因此,只要不尝试更改与您相同的节点,其他线程就可以在树中处于活动状态。
我找不到实现删除具有 2 个子节点的节点的方法。正常算法说找到要删除的节点的顺序后继,将其放置在已删除节点的位置,然后删除复制的节点。但这可能会给位于这两个节点之间并需要复制节点的线程带来问题,在传输之后,该线程将找不到请求的节点,即使它在树中。
看下面的例子:Tread 1 正在执行remove(5)。它找到下一个键 (6) 并将其复制到节点,然后从副本中删除该节点。但同时另一个线程正在执行contains(6) 命令并在节点 8 上等待,执行后节点 6 将不再在其路径中,即使 6 节点仍在树中,它也会返回错误结果.
remove 命令之前的状态图示(蓝色箭头表示第 2nd 线程所在的位置。
remove 命令后的状态图示(蓝色箭头表示第 2nd 线程所在的位置。
如何在不锁定整个树的情况下解决这个问题?
【问题讨论】:
-
你为什么要使用 BST 来满足这个要求?
-
@RohitShetty,这是一个专门用于创建多线程安全 BST 的练习。
标签: java multithreading binary-search-tree synchronized