我正在开发一个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魔法可以避免这种情况。任何巫师都在关心分享这些神奇的东西吗?
谢谢!
答案 0 :(得分:2)
JavaScript目前是单线程的。除非你在获取和设置previous
之间的某个地方调用setTimeout,否则你不会遇到竞争条件。
如果JavaScript的多线程实现可用,它也会(很可能)引入某种锁定机制,这将允许您保留命令式样式,同时锁定关键代码部分。
答案 1 :(得分:2)
由于Javascript不是多线程的,因此您在给出的示例中没有问题。对于今天的所有意图和目的,这是一个原子操作。