0

Brain Goetz による安全な構築手法に関するこの優れた記事を読んで、リスト 5 内にあるコメントに混乱しました。コード スニペットは次のとおりです。

public class Safe { 

 private Object me;
 private Set set = new HashSet();
 private Thread thread;

 public Safe() { 
 // Safe because "me" is not visible from any other thread
 me = this;

// Safe because "set" is not visible from any other thread
 set.add(this);

// Safe because MyThread won't start until construction is complete
// and the constructor doesn't publish the reference
   thread = new MyThread(this);
}

public void start() {
   thread.start();
 }

private class MyThread(Object o) {

private Object theObject;

public MyThread(Object o) { 
  this.theObject = o;
}

...
 }
}

なぜ彼はこれについて言うのmeですか?// Safe because "me" is not visible from any other thread. 2 つのスレッドが同時にインスタンス変数にアクセスできませんmeか?

4

3 に答える 3

3

唯一のポイントは、コンストラクターが実行されている間、それをプライベート プロパティに設定してリークthisしないことです。コンストラクターが完了し、呼び出し元thisがオブジェクトの参照 (明らかにme参照でもある) を受け取った後、それを任意のスレッドに発行できるため、実際には任意のスレッドからアクセスできるようになります。しかし、それはゲッツが主張していたポイントではありませんでした。

于 2012-07-02T08:31:53.083 に答える
0

private修飾子自体は、スレッド セーフを保証しません。ただし、他のスレッドがオブジェクトにアクセス/表示できないということです。ここでは、 のインスタンスがSafeMyThread に渡されており、他の場所に保存/公開されていません。

于 2012-07-02T08:24:16.857 に答える
0

このコードについては、次の点に注意してください。

  1. meprivate
  2. me外部コードへのアクセスを間接的に許可するパブリック メソッドは他にありません。

    これら 2 つを一緒に使用すると、参照のスレッド セーフが可能になりmeます。クラスが再設計されて、以下のように別のパブリック メソッドを持つ場合:

public Safe someMethodForPublicAcess(){ return me; }

me次に、メンバーがであっても、スレッドセーフはなくなりprivateます。これは、外部コードがこのパブリック メソッドを呼び出しmeて、好きなことを実行できる複数のスレッドに渡すことができるようになったためです。

于 2012-07-02T09:09:03.047 に答える