11

私は Java GUI で競合状態を扱っていると思います。

次のような匿名クラス内に「匿名メソッド」を作成するメソッドがいくつかあります。

synchronized foo()
{
     someMethod(new TimerTask()
     {
          public synchronized run()
          {

               //stuff

          }
     };
}

質問: その run メソッドは、TimerTask オブジェクトまたは foo が含まれているクラスで同期されていますか?

質問 2: run() 宣言で「synchronized」を削除し、代わりに run() 本体内に synchronized(this) {} ブロックがある場合、「this」は TimerTask オブジェクトまたはオブジェクトを参照します。 foo() を含むメソッドのインスタンスですか?

ここで私を助けてください。

ありがとう、ジブ

4

4 に答える 4

14

メソッドはそれ自体runで同期されTimerTaskます。同期されたインスタンスメソッドは、常にオブジェクト上で同期されthisます。(クラスメソッドはオブジェクトで同期されClassます。)

メンバーであるオブジェクトで同期する場合は、キーワードを修飾fooする必要があります。クラスのメンバーであるとすると、のメソッド内で、次を使用できます。thisfoo()Barrun()TimerTask

public void run() {
  synchronized(Bar.this) {
    ...
  }
}
于 2009-04-30T22:49:38.393 に答える
2

私はこれらの答えにかなり確信を持っていますが、良いソース atm を掘り起こすことはできません。

最初の質問:
Synchronized は TimerTask をロックします。

2 番目の質問:
これは TimerTask に関するものです。含まれているオブジェクトをロックしたい場合は、 MyContainingObject.this を使用します

于 2009-04-30T22:46:25.530 に答える
1

スイング要素にアクセスできるスレッドは 1 つだけです。それが AWT-EventQueue-0 です。このことを認識しておく必要があります。他のスレッドが要素を描画または変更している場合、GUI がクラッシュする可能性が非常に高くなります。このスレッドで GUI を実行するには:

  試す {
            SwingUtilities.invokeAndWait(new Runnable(){
                public void run(){
                    Swing_Prozor1 prozor = new Swing_Prozor1();
                }
            });
        キャッチ(InterruptedException e){
            //namjerno zanemareno
        } キャッチ (InvocationTargetException e) {
            //namjerno zanemareno
        }

匿名クラスがある場合、これはあなたがいるクラスのインスタンスを提供します。したがって、匿名クラスで書いている場合はこれです。そのクラスのインスタンスです。書きたいクラスのインスタンスを取得するには:

ClassName.this

うーん、あなたが書いた上記のコードはこれを教えてくれます。コードの一部を 2 回予測しました。同期化されたメソッドを記述すると、一度に 1 つのスレッドだけがこのメソッドにアクセスできることを意味します。同期化されたメソッドがロック解除されている間、他のスレッドは待機します。

于 2009-04-30T23:14:12.547 に答える
0

foo() と run() の同期を探している場合は、次のような明示的なロック オブジェクトを作成できます。

最終オブジェクト ロック = 新しいオブジェクト();

その上で同期します。

foo() {
    synchronized(lock) {
       someMethod(new TimerTask() {
          public void run() {
              synchronized(lock)  {
                     //stuff
              }
          }
      }
于 2009-05-01T11:35:53.950 に答える