1

私は、Javascript 逆単一リンク リストの実装に取り​​組んでいます。つまり、リンクされたリストは、次へのリンクなどを含む head オブジェクトを格納する変数によって参照される代わりに、リストの最後のノードを参照する末尾の変数に格納され、それぞれにリンクが含まれます前のノードへ。実装の要点は次のとおりです。

// 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 ATime Bの間にリストに対して別のプッシュが行われた場合、それpreviousTime Aのテールであり、 Time Bの後にテールに割り当てられると仮定すると、最初のノードのプッシュは失われます。

このような競合状態をどのように回避できるのか、私は困惑しています。私が最初に考えたのは、同時プッシュを防止するロックを実装することでしたが、これを回避する賢い JS ウィザードがおそらくあるでしょう。この魔法の一部を分かち合いたい魔法使いはいますか?

ありがとう!

4

2 に答える 2

2

JavaScript は現在シングルスレッドです。getと setting の間のどこかで setTimeout を呼び出さない限りprevious、競合状態になることはありません。

JavaScript のマルチスレッド実装が利用可能になると、(ほとんどの場合) なんらかのロック メカニズムが導入され、重要なコード セクションをロックしながら、命令型スタイルを維持できるようになります。

于 2013-02-16T04:59:33.407 に答える
2

Javascript はマルチスレッド化されていないため、指定した例では問題ありません。これは、今日のすべての意図と目的において、アトミック操作です。

于 2013-02-16T05:00:07.493 に答える