避免JS反向单链表中的竞争条件

时间:2013-02-16 04:51:11

标签: javascript linked-list race-condition

我正在开发一个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 时间A 的时间,让我们在将tail设置为新对象时调用该点时间B 。如果在时间A 时间B 之间对列表进行了另一次推送,则其previous将是时间A 的尾部,假设它会在时间B 之后将自己分配给尾部,第一个节点推送将会丢失。

我对如何避免这种竞争条件感到困惑。我最初的想法是实现一个阻止并发推送的锁,但可能有一些聪明的JS魔法可以避免这种情况。任何巫师都在关心分享这些神奇的东西吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

JavaScript目前是单线程的。除非你在获取和设置previous之间的某个地方调用setTimeout,否则你不会遇到竞争条件。

如果JavaScript的多线程实现可用,它也会(很可能)引入某种锁定机制,这将允许您保留命令式样式,同时锁定关键代码部分。

答案 1 :(得分:2)

由于Javascript不是多线程的,因此您在给出的示例中没有问题。对于今天的所有意图和目的,这是一个原子操作。