3
다음 코드는 plain() 메서드를 호출하기 전에 동기화 된 sync() 메서드에서 차단됩니다. 이것이 왜 그렇게, intrinsic lock 블록이 동기화 된 메소드만을 호출해서는 안된다. 예를 들어 plain()이 동기화되어 있다면이 동작은 괜찮을 것이다.동기화 된 메서드가 실행될 때 블록을 동기화하지 않음
자바가 사용하는 모니터 개념은 동기화 된 메소드/블록에만 적용됩니다. 정의에 따라 동기화되지 않은 코드의 실행에는 영향을 미치지 않아야합니다. 이것이 항상 사실입니까, 아니면이 동작 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...
오 하나님 ... 내가 뭘 했지 .. 감사합니다 !! – haps10
@ haps10 우리에게 가장 좋은 일이 생깁니다 :-) – maba