次のコードは、plain() メソッドを呼び出す前に同期された sync() メソッドでブロックします。なぜそうなのか、固有のロック ブロック呼び出しは同期されたメソッドのみであってはなりません。たとえば、plain() も同期されていれば、この動作は問題ありませんでした。
Java が使用するモニターの概念は、同期されたメソッド/ブロックにのみ適用されるため、定義上、同期されていないコードの実行に影響を与えるべきではありません。これは常に当てはまりますか、それともこの動作は JVM 実装固有のものですか。
public class Main {
public static void main(final String[] args) {
final Main main = new Main();
new Thread(new Runnable() {
@Override
public void run() {
main.sync();
}
}).run();
main.plain();
}
public synchronized void sync() {
try {
System.out.println("sleeping...");
Thread.sleep(2000);
System.out.println("out...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void plain() {
System.out.println("plain...");
}
}
出力:
sleeping...
out...
plain...