2

最終的なプライベートオブジェクトで同期が推奨されることはよく知られています(データメンバーthisでの同期と比較して)。protected

しかし、アプリケーションに共通のオブジェクトで同期する必要のある複数のクラス(モジュール)がある場合はどうなりますか?

これら2つの一見矛盾する要件を調整する方法はありますか?

説明をわかりやすくするために、クラスのプライベートデータメンバーが次のようにOwner定義されている場合:

private final Object $01pfo = new Object[0]; 

次に、の任意のメソッドでOwner簡単に使用できます。

  protected void anyMethod()  {
    synchronized ($01pfo) {
          // do your thing
    }
  }

$01pfoしかし、別のクラス(たとえば)から同期したい場合、保護または公開Userする唯一のオプションはありますか?$01pfo

protected final Object $01pfo = new Object[0]; 

より良いアプローチはありますか?または解決策?

4

3 に答える 3

3

キーワードのpackage-privatenessをprotectedハックとして使用することを検討します。あなたのユースケースでは、クラスが協力して特定のタスクを同期的に実行しているように見えます。このタスクを開始するクラス/メソッドでLockオブジェクトを定義し、コンストラクター引数として渡すことにより、関係するすべてのクラスでLockオブジェクトを明示的に使用できるようにします

于 2012-09-20T18:42:21.613 に答える
2

同期されたブロックは、複数のオブジェクトに分散されていない場合に適切に機能します。

複数のクラスで単一のロックを使用して操作を同期する必要がある場合は、 ロックの実装を確認することをお勧めします。

これにより、複数のスレッドでリソースへのアクセスを細かく調整する際の自由度が大幅に高まります。

于 2012-09-20T19:20:48.980 に答える
0

あなたが提供するリンクは、これの代わりにプライベートファイナルを検討する状況について明確です:

  • インスタンスの同期について話しています。
  • 同期(this)が提供する以外の粒度がロックに必要な場合、同期(this)は適用されないため、問題にはなりません。

別の粒度が必要な場合は、別の同期オブジェクトを自由に使用してください。ところで、あなたの例では、

 private final Object $01pfo = new Object() 

十分でしょう。

于 2012-09-20T18:55:03.897 に答える