0

A というコードの親ブロックがある場合、A は同期されます。そして、A では、B というコードの子ブロックを実行します。B も同期されると仮定してもよろしいですか?


AI に特定の t 時間で B の実行を遅らせるタイマーがある場合、A が既に終了した後で B が実行される可能性はありますか?


どうもありがとうございました。


P/S: わかりにくいコードで申し訳ありません。

   synchronized  A{
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
      @Override
      public void run() {
        B block
      }
    }, 2*60*1000);

    } 
4

2 に答える 2

2

依存します。ブロック B がこのようなメソッド内のコードのブロックである場合、はい...同期されます。

public synchronized void methodA() {
    // Block B
    {
       // some code
    }
}

次のような別の方法の場合は、いいえ:

public synchronized void methodA() {
    methodB();
}

public void methodB() {
    // Block B code
    // Nothing prevents an unsynchronized method from calling this method
    //   at same time as methodA() holds  lock on `this` object
}

methodBがマークされているsynchronized 、別の同期メソッド (例: / public synchronized methodC())から呼び出されていないか、別の同期メカニズムが使用されていない限り、methodB()は同期されません。

これらは最も単純なケースです。「ブロック」はデフォルトでは適切に定義されておらず、同期ロックのタイプ(this同期メソッドによる暗黙的なロックと明示的なオブジェクトロック)によって違いが生じるため、サンプルコードを投稿することをお勧めします。

しかし、最後の行は、コードの同期実行と非同期実行について尋ねているように聞こえますが、これはスレッドとsynchronizedブロックに関連していますが、異なる概念です。

その場合、何が起こるかに依存しblock Aます...実行するために新しいスレッドが作成された場合block B、コード実行のタイミングで何かが起こる可能性があります。block Aスレッドが作成されていない場合、それまでに完了しないと想定しても安全block Bです。

編集:現在投稿されているコードに基づいて...同期A blockは、タイマースレッドが一度に1つずつ作成されることのみを保証します。ただし、Java フレームワークに特別な事情がない限り、メソッド内でTimer2 つのスレッドが同時に実行されるのを妨げるものは何もないので、コンテンツがスレッド セーフであることを確認してください。B blockrun

つまり、異なるインスタンスがTimer同期ブロックで同じ遅延で作成されたからといって、それらが同時に run メソッドに入らないと仮定しないでください。外部のB block非スレッド セーフ コード (静的メソッド、ディスク アクセスなど) にアクセスすると、驚きが生じる可能性があります。

Amm Sokun が他の回答で述べたように、実行A{}前に戻ります。 Block B

于 2015-07-02T13:03:17.250 に答える
1

ブロック B は、A の実行が終了した後に実行されます。これは、メソッド A で B をミリ秒後に実行するようにスケジュールしているだけ2*60*1000であり、タイマーがミリ秒後に B を実行することを処理するためです2*60*1000

于 2015-07-02T13:15:02.903 に答える