メソッドの内容全体を同期している場合、機能的な違いはありません。メソッドの一部のみを同期する場合は、同期の範囲が異なります。
同期ブロックの後のコードが同期ブロックの前に実行されないことは正しいです。ただし、スレッドは、同期されていない任意の時点でスワップアウトできます。次の点を考慮してください。
synchronized (this) {
//sycnronized bit
}
// some other code
2 つのスレッドがあり、A と B があり、A がロックを取得すると、B は A が同期ブロックを終了するまでブロックされます。ただし、A は、このブロックを終了するとすぐにスワップ アウトされる可能性があります。その後、B は同期ブロックに入り、A がスワップインされる前に機能を完了することができます。
これは非常に一般的に使用できます。たとえば、複数のスレッドが高価な計算を実行できるようにしながら、可変インスタンス変数が計算の範囲で一貫していることを確認する場合などです。例えば
Object localCopy;
synchronized (this) {
localCopy = this.instanceVar;
}
// expensive calculation using localCopy which won't change even if instanceVar is changed.