2017-08-09 17 views
1

シンクロナイズ(静的メソッドと非静的メソッド)の動作について少し混乱します。例えば静的メソッドと非静的メソッドのJava同期

:コールsomeMethod1を()スレッド場合

1.

class MyClass { 
    ... 
    public synchronized static someMethod() { 
    ... 
    } 
    public static someMethod2() { 
    ... 
    } 

    ... 
} 

ので、スレッドB)がsomeMethod2(上のロックを持っているのですか?

2.

 class MyClass { 
    ... 
    public synchronized someMethod() { 
    ... 
    } 
    public someMethod2() { 
    ... 
    } 

    ... 
} 

我々はMyClassのA =新しいMyClassの()を持っている場合は、(呼び出しメソッドのsomeMethodスレッド)、スレッドは()someMethod2をロックしているのでしょうか?

答えて

1

両方の答えはいいえです。同期は協調的なメカニズムです。インスタンスまたはクラスを同期させても、そのメソッドが同じモニター上で同期しない限り、他のスレッドが別のメソッドを呼び出すことはできません。

0

どちらの質問でも、答えはNoです。このメソッドは同期されていないので、スレッドsomeMethod2にはスレッドBがロックされません。 同期化と関連するロックは、両方のスレッドがsomeMethodを呼び出す場合にのみ機能します。

この場合の唯一の違いは、ロックされるターゲットです。同期メソッドはメソッド受信者をロックとして使用します(つまり、非静的メソッドの場合はthis、静的メソッドの場合は囲みクラス)

+0

同期は、非同期メソッドの呼び出しをブロックしません。 – shmosel

+0

ありがとう、答えを変更しました。私は質問を正しく理解しませんでした –

0

いいえ、これらの場合は別の方法で自由にロックできます。他のスレッドがクラスの非静的メソッドをロックしている場合、スレッドは静的メソッドのロックを取得できます。これらのメソッドには異なるモニターがあります。

静的メソッドが同期されている場合は、クラスに対して同期します。つまり、静的メソッドの実行中にクラス全体がブロックされます。したがって、他の静的同期メソッドもブロックされます。それ以外の場合、静的でないメソッドが同期されている場合、インスタンス上で同期します。この特定のオブジェクトのみのすべての同期メソッドはブロックされます。

+0

しかし、他の方法は同期されていません。 – shmosel

関連する問題