我有一个看起来像这样的程序
class Outer {
class Inner implements Runnable {
public void run() {
doSomething();
}
}
public synchronized void doSomething() {
//...
}
}
Inner.run()
在调用doSomething()
时获取了哪个锁?它与synchronized(Inner.this)
或synchronized(Outer.this)
相同吗?
提前多多感谢。
答案 0 :(得分:4)
在doSomething()
内调用run()
的接收方为Outer.this
。因此synchronized
将监视器锁定在该表达式引用的对象上。
在computing the target reference in a method invocation expression上,JLS说
否则,让
T
成为封闭类型声明 方法是成员,让n
为整数,T
为n'th
词法封闭类型声明的类声明 立即包含方法调用。目标参考是n'th
词汇封闭的实例。
T
这里是Outer
,因为那是声明它的类。 n
为1,因为Outer
是Inner
的直接封闭类型声明。因此,目标参考是this
的第1个词汇封闭实例,即。 Outer.this
。
Concerning synchronized
methods,JLS说
对于实例方法,与
this
关联的监视器(对象 (使用该方法)。