我正在研究一个 Javascript 反向单链表实现。也就是说,一个链表不是由存储头对象的变量引用,该变量包含指向下一个对象的链接,依此类推,而是存储在尾变量中,该变量引用列表的最后一个节点,每个节点都包含一个链接到前一个节点。实现的要点如下:
// A reversed linked list of the sequence 1, 2, 3
var tail = {
value: 3,
previous: {
value: 2,
previous: {
value: 1,
previous: null
}
}
};
将新节点推送到此列表 ( tail
) 末尾的代码如下所示:
tail = {
value: 4,
previous: tail
};
这是一个演示:http: //jsbin.com/ajixip/1/
我预见到的问题是在检索当前值tail
和设置新值之间可能发生的竞争条件。
例如,考虑一个用户触发一个事件,该事件将一个新值推送到列表的尾部。让我们调用 tail 的值被检索并分配给键previous
Time A的时间,让我们调用 tail 设置为新对象Time B的时间点。如果在Time A和Time B之间对列表进行了另一次推送,则previous
它将是Time A的尾部,并假设它将在Time B之后将自己分配给尾部,则第一个节点推送将丢失。
我对如何避免这种竞争条件感到困惑。我最初的想法是实现一个防止并发推送的锁,但可能有一些聪明的 JS 魔法可以避免这种情况。有没有巫师愿意分享一些这种魔法?
谢谢!