在用Java编写BST的多线程实现时,我遇到了以下问题。该BST不应使用全局锁定,而应尽可能少地锁定,仅锁定要更改的节点(添加和删除命令)。因此,其他线程只要不尝试更改与您相同的节点,就可以在树中处于活动状态。我找不到一种方法来删除具有2个子节点的节点。普通算法说要找到要删除的节点的顺序后继者,以将其放置在已删除的节点的位置,然后再删除已复制的节点。但这可能会在这两个节点之间的线程中产生问题,并且需要复制的节点,在传输之后,即使该线程在树中,该线程也不会找到所请求的节点。看一下下面的示例:正在执行Tread 1remove(5)
。它找到下一个键(6)并将其复制到该节点,然后从副本中删除该节点。但是同时,另一个执行contains(6)
命令的线程正在节点8上等待,执行节点号6之后将不再位于其路径中,即使6节点仍在树中,它也会返回错误的结果。
删除命令之前的状态示意图(蓝色箭头指示第二个线程在何处。
删除命令后的状态示意图(蓝色箭头指示第二个线程在何处。
如何在不锁定整个树的情况下克服此问题?
哈士奇WWW
相关分类