ABAの問題を理解しています。しかし、私が理解できないことは、自動ガベージコレクションを備えた言語ではそれが示されない可能性があると言われていることです。だから私の質問は:
- 自動ガベージ コレクションで ABA の問題が発生するのを防ぐにはどうすればよいですか?
- それはJavaで可能ですか?
- これを防ぐことは可能ですか?
ABAの問題を理解しています。しかし、私が理解できないことは、自動ガベージコレクションを備えた言語ではそれが示されない可能性があると言われていることです。だから私の質問は:
自動ガベージ コレクションが有効になっている場合、2 つのオブジェクトに同じ参照を割り当てて同時に共存させることはできません。これは、参照カウントが 0 より大きい限り、参照自体が解放されて再利用されないためです。 .
したがって、誰かがまだ古い参照を持っている間は、参照の内容を別のオブジェクトの「ポイント」に「切り替える」ことはできません。
ABA 問題は、ガベージ コレクションと直交しています。たとえば、アプリケーションはオブジェクトをリンク リストからフリー リストに移動し、すぐに再利用できます。したがって、オブジェクトが再利用される前に実際に解放されることはありません。そうは言っても、ABAの問題は次のように発生する可能性があります。
Thread1:
prevHead = head;
Thread2:
prevHead = head;
newHead = getFromFreeList();
if (cas(&head, prevHead, newHead)) addToFreeList(prevHead);
Thread3:
prevHead = head;
newHead = getFromFreeList(); // Get the same object 'released' by Thread2
cas(&head, prevHead, newHead) // succeeds and put back what was removed by Thread2
Thread1:
newHead = getFromFreeList();
if (cas(&head, prevHead, newHead)) addToFreeList(prevHead);
// CAS will succeed although it shouldn't since there were
// a modification on the head done by 'Thread3' in between.
自動ガベージ コレクションで ABA の問題が発生するのを防ぐにはどうすればよいですか? Herlihy Shavit による「The Art of Multiprocessor Programming」を参照してください。引用:それ (ABA 問題) は、特に動的メモリ アルゴリズムで頻繁に現れます。
もちろん、ABA問題はJavaで発生する可能性がありますが、ほとんどの場合、問題は動的メモリアルゴリズムで発生し、そのようなアルゴリズムをJavaで実装することはあまりないため、Javaでこのエラーが頻繁に発生することはありません。
それはJavaで可能ですか? 本「The Art of Multiprocessor Programming」には、ロックフリーの同時キューのメモリ再利用に関連するこの問題の Java の例が示されています。
これを防ぐことは可能ですか?引用:値が 2 つの時点で同じかどうかではなく、それらの時点間で値が変更されたかどうかをテストすることで、ABA を回避します。これを行う 1 つの方法は、AtomicStampedReference を使用することです。
「The Art of Multiprocessor Programming」という本の中で、プログラマーが独自のリソース プール (たとえば、リスト ノードのプール) を Java で実装したい状況について著者が説明しています。次に、プールを直接管理するプログラマーがガベージ コレクションを回避するため、パフォーマンスが向上します。ただし、ABA の問題を回避するには注意が必要です。
Java でのメモリ管理の Java コードのコアは次のとおりです。
ThreadLocal<Node> freeList = new ThreadLocal<Node>() {
protected Node initialValue() { return null; };
};
LockFreeQueueRecycle.java の完全なコードは、次の場所から入手できます。
http://booksite.elsevier.com/9780123705914/exercises/07~Chapter_10.zip
第 10 章のスライドとコードを参照してください。
http://booksite.elsevier.com/9780123705914/?ISBN=9780123705914