私が書いているライブラリには、2 次元マップを実装するクラスがあり、効率的な読み取りのために、行/列ビューの小さなマップも提供します。これまでのところ、すべてのメソッドがオーバーライドされているため、メイン マップの変更はサブ マップにミラーリングされ、その逆も同様です。問題は同時操作で発生します。
理想的には、マスター マップからアイテムを削除すると、それぞれの行マップと列マップからアイテムが同時に削除されますが、これはもちろん不可能です。たとえば、私のput関数では:
public synchronized Cell put(Duple<Integer, Integer> key, Cell arg1){
//preprocessing, detecting the row/col, creating row/col if not present yet, etc.
Cell outcell = super.put(key, arg1);
rowArr.putPriv(key.getElem2(), arg1);
colArr.putPriv(key.getElem1(), arg1);
arg1.assignCell(this, key);
return outCell;
}
マップの同時読み取りは完全に許容され、同時変更でさえ問題ではありませんが (同期するために remove と put が必要な行/列の作成/削除を除く)、4 段階の変更 (super.put 、行と列の書き込み、およびセル位置の更新) は、一致しないデータを読み取れないようにするためにアトミックである必要があります。
私のオプションは何ですか?私の検索からわかった限りでは、Java でステートメントのアトミック シーケンスを作成することは不可能であり、すべての関数を同期しない限り同期は機能しません (これにより同時読み取りが防止され、複数のロックが必要になります)。アイテム)。私は基本的なセマフォの概念の原則を知っています (ただし、特に実践されていません) が、非常に複雑なロックオンライト セマフォを作成する簡単な方法は見当たりません。書き込みスロット。どのような追加オプションがありますか?
注: 私が取り組んでいるプロジェクトのため、groovy などの派生言語を使用することはできませんが、サード パーティのライブラリがなければ、標準の Java 1.6u24 しか使用できません。