コンテキストやプロジェクトの範囲によっては、匂いかもしれませんが、そうでないかもしれません。キューに登録されているリストを同期させるために5つのロックを操作すると、何か間違ったことが起こっている可能性があります。一般的に私は共有資源とロックの間に良い1-1の比を持っていたい。
細かいレベルでロックすることが魅力的な場合もあります(リスト全体をロックするのではなく、リストの各アイテムをロックする)。プロファイラーがあなたにロックが大量に提供されていると言うまで、その要望を再現してください。
他の場合、単一のリソースを保護するのではなく、多くの競合が発生しないことを知っている特定のbussiness-logicを保護するために、ロックを使用して複数のロックを1つにまとめることができます。あなたは少しパフォーマンスが落ちるかもしれませんが、10個のロックを取り除くことができれば、それはテーブルにもたらすシンプルさのために通常は価値があります。
あなたの質問に対する答えは質問の形であると思います。なぜあなたのクラスAは2つの共有リソースを同時に使用していますか?一般的には、何らかの種類の単一責任主義の原則を使用して設計段階で回避しようとするものです。通常、共有リソースは誰かに属し、誰かがリソースのロック/ロック解除に関する単一の権限です。確認するために
lockA.lock();
//some code
lockA.unlock();
lockB.lock();
//some other code
lockB.unlock();
一つの明確なもの:
あなたがメソッドをリファクタリングすることができます任意の方法はあります(つまりLOCKA> lockB)のロックを注文する所定の有限/定義された方法のみロックがあるはずですそれらを昇順に並べ替えます。
別のスレッドのメソッドは、ClassBの::バー(){lockB.lock()のような何かをした場合あなたは
lockA.lock();
lockB.lock();
や他のいくつかのコードで
lockB.lock();
lockA.lock();
のケースを取得することはありません。 lockA。ロック(); doStuff; lockA.unlock(); lockB.unlock();}(ロック順の逆転に気づく)、デッドロックの条件はありますか?おそらくあなたの答えに追加するには、一貫した順序でロックを行う必要がありますか? – jbu
はい、ロックを一貫した順序で実行する必要があります。 –