スレッドセーフな双方向の関連付けを実装する良い方法は何ですか? おそらく良いライブラリまたはコードジェネレーターはありますか?
非スレッドセーフな例を次に示します。
class Foo {
private Foo other;
public Foo getOther() {
return other;
}
public void setOther(Foo other) {
this.setOtherSecretly(other);
other.setotherSecretly(this);
}
void setOtherSecretly(Foo other) {
if (this.other != null) this.other.other = null;
this.other = other;
}
}
スレッドセーフに対する私の要件は次のとおりです。
- デッドロックなし
- 結果整合性 (すべてのスレッドがオブジェクトの変更を停止すると、最終的に整合性のある状態に到達します。つまり
assert foo.getOther().getOther() == foo
、別のスレッドがsetOther
同時に実行されている場合に失敗することは許容されます。 - 順次動作。スレッドが実行
setOther
され、他のスレッドが値をオーバーライドしない場合、getOther
そのスレッドの新しい値をすぐに返します。 - 時間を遡ることはありません。スレッドが で新しい値を確認すると
getOther
、(再度設定されない限り) 古い値を受け取ることはありません。
また、持っているといいです:
- 競合が少なく、特にグローバル ロックがない。ソリューションは適切にスケーリングする必要があります。
- 同期のオーバーヘッドをできるだけ少なくします。単一のスレッドに対して妥当なパフォーマンスが得られるはずです。
- 低メモリ オーバーヘッド。オブジェクトに 5 つの関連付けがある場合、関連付けごとに 3 つのフィールドを追加したくありません。セッターのローカル変数は問題ありません。
私のアプリケーションには、いくつかのクラスの約 5,000 個のオブジェクトで動作する 16 のスレッドがあります。
私はまだ解決策を思いつくことができませんでした (いいえ、これは宿題ではありません)。