Java 可重入锁问题
ringa_lee
ringa_lee 2017-04-17 16:14:44
0
1
660

看《并发编程实战》P21页里说以下代码:
由于Widget和LoggingWidget中执doSomething方法都是synchronized方法,因此每个doSomething方法在执行前都会获取Widget的锁。

public class Widget {
    public synchronized void doSomething() {
        // do somethig here...
    }
}

public class LoggingWidget extends Widget {
    public synchronized void doSomething() {
        System.out.println(toString() + ": calling doSomething");
        super.doSomething();
    }
}

为什么LoggingWidget上的doSomething方法会获取Widget的锁?不是应该获取的LoggingWidget对象的锁吗?

ringa_lee
ringa_lee

ringa_lee

모든 응답(1)
黄舟

업데이트:

원문의 예와 설명을 주의 깊게 읽어보니 작성자가 실수를 했다는 느낌이 듭니다. 우선 동기화 방법이 잠긴다 this, 그건 확실해.

그리고 객체는 this 하나만 가질 것입니다. 따라서 하위 클래스의 doSomething() 메서드에 있는 this과 상위 클래스는 모두 하위 클래스 LoggingWidget의 개체입니다. 따라서 두 방법 모두 책에서 언급한 LoggingWidget对象이 아닌 Widget对象을 잠급니다.

이 설명은 분명히 틀린 설명이지만 子类对象同时也是一个父类对象 때문에 틀렸다고 할 수 없으므로 LoggingWidget对象Widget对象로 표현해도 문법적 오류는 없습니다. 그러나 여기서 동기화 방법을 논할 때 이 설명은 분명히 잘못된 것입니다(적어도 그렇지는 않습니다). 이는 작성자의 부주의나 인쇄상의 실수로 인한 것입니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿