2016-10-30 5 views
0

Javaで同期ブロックの概念を頭の中で抱いています。私は十分に同期された方法を理解していると感じています。だから私は、同期化された方法に関して同期ブロックを理解するのに役立つ類推を考えました。私が提案しているこの同等性が正しいかどうか教えてください。また、私は今のところ非静的な同期ブロックに対してこれを言及してきました。ただし、静的同期ブロックのポイントも歓迎します。Javaでの同期ブロックの簡略化

public void method() 
{ 
    //code snipppet A 

synchronized(objRef) 
{ 
    //code snipppet B 
} 
    //code snipppet C 
} 

OBJREFのクラスで

public void method() { 
//code snippet A 
objRef.sync_method(); 
//code snippet C 
} 

に相当します。

public synchronized void sync_method() { 
//code snippet B 
} 

このアナロジーは、同期ブロックは、同期の方法は同じように振る舞うのロジックに基づいています。つまり、あるスレッドがモニター上でロックを取得すると、他のスレッドがその実行を妨害することは許されません。スレッドは同期メソッド全体の実行を終了した後にのみ制御を放棄します。

+0

が考える印刷することができます。明確にするために、 'synchronized void method(){blabla(); } 'は' void method(){synchronized(this){blabla();のショートカットです。 }} '。どちらも、オブジェクト 'this'に関連付けられたロックを取得し、次にblabla()でコードを実行し、次にロックを解放します。 –

+1

明確にするために、メソッドではなくオブジェクトのみをロックします。同期メソッドを使用すると、メソッドではなくオブジェクトがロックされます。 –

答えて

2

two types of synchronized block in Java(オブジェクトは同期し、クラスは同期しています)に気づくはずです。 2つの同期メソッド(静的および非静的メソッド)と同等の同期ブロック(クラス同期およびオブジェクト同期ブロック)があります。 は、我々が持っていると仮定します。

class MyClass{ 
public synchronized static void syncStaticMethod(){...} 
public synchronized void syncNonStaticMethod(){...} 
} 


MyClass objRef = new MyClass(); 

1.オブジェクト同期:

public void method() {synchronized(objRef) { ... }} 

public void method() {objRef.syncNonStaticMethod();} 

2.クラスの同期と同等です

は、あなたがすべての権利を取得していない可能性があります

public void method() {MyClass.syncStaticMethod();} 
+0

最後のスニペットは、 'MyClass.syncStaticMethod();'を意味します。しかし、区別するのに重要な点はありません。 MyClass.classは他のオブジェクトと同様のオブジェクトであり、必要に応じてClassオブジェクトのインスタンスメソッドのボディを完全に同期させることができます。 –

+0

2つの方法の命名法が反対であるべきではない(静的および非静的を考慮して)? –

+0

@JBNizet:ありがとうございます。最後のスニペットを修正します。 – Atefeh

3

に相当します。前者の場合にロックがコードの大部分を覆っているので、例えば、

synchronized(objRef) { 
    objRef.nonsync_method(); 
    ... more code ... 
} 

objRef.sync_method(); 

と等価ではありません。同値は、スレッドがモニタにロックを取得したら、それは他のスレッドがその実行

に干渉することはできませんまた

synchronized void sync_method() { 
    // stuff 
} 

void nonsync_method() { 
    synchronized (this) { 
     // stuff 
    } 
} 

の間に存在します

私たちがどのように解釈するかによって、上記は真実かもしれませんあいまいな表現。ロックを獲得したスレッドは、他のスレッドがその実行を妨害することを容易に可能にします。つまり、まったく同じロックでカバーされない別のコードです。例えば、

int i; 

synchronized void sync_method() { 
    i = 0; 
    System.out.println(i); 
} 

void nonsync_method() { 
    i = 42; 
} 

sync_method()への呼び出しは、あなたがそれを得た* I *はともに0と42

+0

あなたの最初の点に関しては、それはまさに私の質問の意味です。あなたはそれをより明確で具体的な方法で書いています。私はそれを反映するために私の質問を編集します。あなたの_second_点については、 'sync_method()'の呼び出しが0と42の両方をどのように出力するのか分かりません。 –

+0

1. syncMethodを呼び出します。 2.i = 0; 3.別のスレッドがnonsyncMethodを呼び出します。 4.i = 42; 5. iを印刷します。 –

+0

さて、あなたは今何を意味しているのか分かります。 –