从内部类调用外部类的同步方法

时间:2016-06-01 22:52:53

标签: java inner-classes synchronized

我有一个看起来像这样的程序

class Outer {
    class Inner implements Runnable {
        public void run() {
            doSomething();
        }
    }

    public synchronized void doSomething() {
        //...
    }
}

Inner.run()在调用doSomething()时获取了哪个锁?它与synchronized(Inner.this)synchronized(Outer.this)相同吗?

提前多多感谢。

1 个答案:

答案 0 :(得分:4)

doSomething()内调用run()的接收方为Outer.this。因此synchronized将监视器锁定在该表达式引用的对象上。

computing the target reference in a method invocation expression上,JLS说

  

否则,让T成为封闭类型声明   方法是成员,让n为整数,Tn'th   词法封闭类型声明的类声明   立即包含方法调用。目标参考是   n'th词汇封闭的实例。

T这里是Outer,因为那是声明它的类。 n为1,因为OuterInner的直接封闭类型声明。因此,目标参考是this的第1个词汇封闭实例,即。 Outer.this

Concerning synchronized methods,JLS说

  

对于实例方法,与this关联的监视器(对象   (使用该方法)。