34

Javaの同期メソッドと同期ブロックの違いは何ですか?同期メソッドとJavaの同期ブロックの違いは何ですか?

私はネット上で答えを探してきた、人々はこの1

:-(私のテイクが両者の間に差は同期ブロックは、よりかもしれないことを除いて、存在しないだろうがそんなにわからないように見えますスコープ内に局在するので、ロックが低い時のものであろう

と静的メソッドのロックの場合は??、ロックが取られているものに?クラスのロックの意味は何ですか?

+0

を@のtry-catch-ようやくそれがこの質問の重複はありません。その質問は、同期メソッドがメソッドにのみ、またはオブジェクト全体に排他的にアクセスできるかどうかを尋ねます。 –

+0

@MarkRotteveelあなたはさまざまなタイトルの点で正しいです。一方、他の質問の答えは、同期セクションをいくつかのステートメントに限定して(またはそうではない)、ロックする場所を制御する(または制御しない)という違いをカバーしています。 –

答えて

44

同期化された方法では、メソッド受信機をロックとして使用します。非静的メソッドの場合はthis、静的メソッドの場合は囲みクラス)。 Synchronizedブロックは式をロックとして使用します。

だから次の2つの方法が将来のロックから等価です:静的メソッドの場合

synchronized void mymethod() { ... } 

void mymethod() { 
    synchronized (this) { ... } 
} 

、クラスがロックされます:synchronizedブロックについては

class MyClass { 
    synchronized static mystatic() { ... } 

    static mystaticeq() { 
    syncrhonized (MyClass.class) { ... } 
    } 
} 

、あなたが任意の非nullを使用することができますロックとしてのオブジェクト:

synchronized (mymap) { 
    mymap.put(..., ...); 
} 

ロックスコープ

同期メソッドの場合、ロックはメソッドスコープ全体に保持され、​​ブロックでは、ロックはそのブロックスコープ内でのみ保持されます(クリティカルセクションとも呼ばれます)。実際には、JVMは、ブロック実行が安全に実行できることを証明できれば、ブロック実行からいくつかの操作を削除することによって最適化することができます。

+0

メソッドの同期化は、メソッド本体全体をカプセル化していても、ブロック上で同期させるよりもJVMによって内部的に最適化する方が簡単なことがあります。試してみると面白いマイクロベンチマークかもしれません。 –

+1

ロックスコープでは、おそらく、 "...同期されたブロックでは、ロックは同期ブロックの間だけ保持されます"ではなく "...同期されたメソッドでロックは同期ブロックの間だけ保持されます" – mrvincenzo

+2

@ Gregory Mostizkyこの記事では、同期ブロックと比較した場合、JVMは同期メソッドのバイトコードを少なく作成します。 http://www.ibm.com/developerworks/java/library/j-5things15/index.html?ca=drs- –

3

はいこれは1つの違いです。もう1つは、this以外のオブジェクトに対するロックを取得できることです。

8

同期メソッドは省略形です。この:で、だから、実際に

class Something { 
    public void doSomething() { 
     synchronized(this) { 
      ... 
     } 
    } 

    public static void doSomethingStatic() { 
     synchronized(Something.class) { 
      ... 
     } 
    } 
} 

Something.classはクラスSomethingのクラスオブジェクトであるところ。)

を:

class Something { 
    public synchronized void doSomething() { 
     ... 
    } 

    public static synchronized void doSomethingStatic() { 
     ... 
    } 
} 

は、すべての意図や目的のために、これに相当します同期化されたブロックを使用すると、ロックについてより具体的にできます。また、使用するタイミングについては細かいことができますが、違いはありません。オブジェクトインスタンスに

0

同期方法ロックは、方法は、中に含まれる同期ブロックなどの任意のオブジェクトにロックすることができ

- インスタンス変数として定義され、典型的にはミューテックスobect。これにより、ロックの動作をより詳細に制御できます。

2

主な違いは次のとおりです。同期するメソッドを宣言すると、メソッドの本体全体が同期化されます。ただし、synchronizedブロックを使用すると、synchronizedブロック内のメソッドの「クリティカルセクション」だけを囲み、残りのメソッドはブロックから取り除くことができます。

メソッド全体がクリティカルセクションの一部である場合、実質的に違いはありません。そうでない場合は、クリティカルセクションの周りに同期ブロックを使用する必要があります。同期化されたブロック内のステートメントが多いほど、並列性が低下するため、それらを最小限に抑える必要があります。

+0

クイック・フォローアップ:同期化されたブロックは、同期化された方法よりも安価です? – Everyone

+0

同期ブロックに関数のすべての内容が含まれている場合、違いはありません。ただし、同期ブロックを使用する場合は、クリティカルセクションだけを囲むことができます(おそらく、計算の一部を同期領域外に残すことができます)。そうすると、プログラムはより速く実行されます。 –

0

私の考えでは、2つの間に違いはありませんが、シンクブロックのスコープがよりローカライズされている可能性があるため、ロックの時間は短くなりますか?

はい。あなたが正しいです。​​のメソッドとは異なり、synchronizedステートメントでは、組み込みロックを提供するオブジェクトを指定する必要があります。 Javaのチュートリアルから

例:

​​

同期文もきめ細かい同期と並行性を改善するのに有用です。以下のユースケースについては、同じチュートリアルページで良い例を見つけることができます。

たとえば、クラスMsLunchには、2つのインスタンスフィールドc1とc2があり、それらは決して一緒に使用されないとします。これらのフィールドの更新はすべて​​である必要がありますが、c1の更新がc2の更新とインターリーブされないようにする理由はありません。そうすることで、不要なブロックを作成することで並行性が低下します。 同期メソッドを使用するか、またはこれに関連するロックを使用する代わりに、ロックを提供するためだけに2つのオブジェクトを作成します

ロックの静的メソッドの場合は、ロックは何ですか?ロックオンクラスの意味は?

この場合、スレッドは、そのクラスに関連付けられたClassオブジェクトの組み込みロックを取得します。したがって、クラスの静的フィールドへのアクセスは、そのクラスの任意のインスタンスのロックとは異なるロックによって制御されます。

あなたはsynchronized(非static)などの方法で作るとき:

を同じオブジェクトの​​メソッドの2つの呼び出しをインターリーブすることはできません。あるスレッドがオブジェクトの同期メソッドを実行しているとき、そのオブジェクトで最初のスレッドが完了するまで、同じオブジェクトブロックの同期メソッドを呼び出す他のすべてのスレッド(実行を中断)。

あなたはstatic synchronizedの方法にする場合:

を同じクラスの異なるオブジェクト上のstatic synchronizedメソッドの2つの呼び出しをインターリーブすることはできません。 1つのスレッドがクラスAのオブジェクトに対してstatic synchronizedメソッドを実行している場合、メソッド実行で最初のスレッドが終了するまで、クラスAのオブジェクトのいずれかでメソッドstatic synchronizedを呼び出す(実行を中断する)すべてのスレッド。

あなたはこのSEの問題の同期へのより良い代替手段を見つける:

Avoid synchronized(this) in Java?

関連する問題