2016-06-01 14 views
2

からsyncronized方法は、私はそれがdoSomething()を呼び出しているときInner.run()取得しロックこの呼び出し外クラスの内部クラス

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

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

のように本質的に見えるプログラムがありますか? synchronized(Inner.this)またはsynchronized(Outer.this)と同じですか?

ありがとうございます。

+2

'synchronized'はcallsiteとは関係ありません。 – SLaks

+0

'Inner.this'と' Outer.this'はJavaで有効なコードではありません。 – SamTebbs33

+2

@ SamTebbs33そうです。これらのクラスを使用すると、内部クラスのインスタンスを囲むことに固有のことができます。 –

答えて

3

run()内のdoSomething()の呼び出しの受信機はOuter.thisです。したがって、​​は、その式によって参照されるオブジェクトでモニタをロックします。 computing the target reference in a method invocation expression

、JLSは

言うそうでない場合、Tは 方法がメンバーである囲み型宣言すること、及びnTn'th 字句的に取り囲むタイプであるような整数であるせましょう宣言が のメソッド呼び出しをすぐに含むクラスの宣言。ターゲット参照は n'thこれを字句的に囲むインスタンスです。それはそれを宣言したクラスですので、ここで

Tは、Outerです。 nは1であり、Outerはすぐに囲むタイプの宣言であるInnerです。したがって、ターゲット参照は、1番目の語彙的に包含するthisのインスタンスです。 Outer.this

Concerning synchronized methods、JLSは、インスタンスメソッドについて

、使用さthis(メソッドが呼び出されたのオブジェクト )に関連付けられたモニターを言います。

関連する問題