依存します。ブロック 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 フレームワークに特別な事情がない限り、メソッド内でTimer
2 つのスレッドが同時に実行されるのを妨げるものは何もないので、コンテンツがスレッド セーフであることを確認してください。B block
run
つまり、異なるインスタンスがTimer
同期ブロックで同じ遅延で作成されたからといって、それらが同時に run メソッドに入らないと仮定しないでください。外部のB block
非スレッド セーフ コード (静的メソッド、ディスク アクセスなど) にアクセスすると、驚きが生じる可能性があります。
Amm Sokun が他の回答で述べたように、実行A{}
前に戻ります。
Block B