2017-01-20 8 views
-1

私はマルチを経由していましたスレッディングの概念。synchronized(foo.class)とsynchronized(SomeClass.class)の違い

public class Foo{ 

    public void testMethod1(){ 

     synchronized(foo.class){ 

     // only one thread can access this block at a time 
     } 

    } 

    // or i can use the below method 

    public void testMethod2(){ 

     synchronized(SomeClass.class){ 

     // only one thread can access this block at a time 

     } 
    } 

} 

私は自分のコードでtestMethod1またはtestMethod2のいずれかを使用します。

あなたは私がtestMethod2()testMethod1()、 とSomeClass.classFOO.CLASSに​​を使用しています見ることができるように。

私が使用しているメソッドが複数のスレッドアクセスで同じ結果を与えている場合。 同期ブロックと同期ブロックのために同じクラスを使用する必要がある場合の使用法の違いを知りたいと思います。

上記の2つの方法に違いはありますか?

+1

これらの間に違いはありません。 –

+2

はい、違いがあります。他のスレッドが 'synchronized(SomeClass.class)'クラス内でコードを実行できる間に、同じオブジェクト上で同期していないので、相互排他的ではありません。つまり、あるスレッドがsynchronized(foo.class) 、 **同時に**。 – Andreas

+1

私の所見。 AnyClass.classまたはAnyClass.getClass()は、一意の/ singleTonのクラスオブジェクトを返します。したがって、synchronized(AnyClass.class)はその参照へのロックを持ち、したがってそのスレッドにアクセスできるスレッドは1つだけです。また、私たちはプライベート静的な最終的なオブジェクトのロックを使用することができます=新しいObject();ロックを作る。したがって、AnyClass.classはsynchronizedブロックで使用できます。 –

答えて

1

クラスではなくオブジェクトで同期をとります。そしてそれはあなたがやっていることです。クラスの2つの異なるインスタンスで同期します。私たちは少し書き換えた場合は、それが明確になる:我々は2つのロックを持っている

public class Foo { 

    // the locks for the synchronized methods 
    private Class<Foo> lock1 = Foo.class; 
    private Class<SomeClass> lock2 = SomeClass.class; 

    public void testMethod1() { 
     synchronized (lock1) { 
      // only one thread can access this block at a time 
     } 
    } 

    public void testMethod2() { 
     synchronized (lock2) { 
      // only one thread can access this block at a time 
     } 
    } 
} 

、両方の方法は、一度に1つのスレッドしか平行であるが、それぞれの方法で実行することができます。我々は両方の方法で同じロックを使用する場合は

、その方法はもう並列に実行することができませんでした

はそれがお役に立てば幸いです(1つのスレッドが方法1を入力した場合、その後、方法2は、あまりにもロックされます) !

+0

こんにちはアンデス。私は質問を編集しました。実際に私のquesitionは同期(foo.class)と同期(SomeClass.class)、私は同期ブロックと同じクラスを使用する必要がありますときに他のいくつかのクラス。私が知っているように、同期ブロックはクラスレベルのロックを行い、そのブロックにアクセスできるスレッドは1つだけです。だから私はどのクラスを使用してクラスレベルのロックを行うことができます。 –

+1

@Andreas_Dクラス参照をロックとして使用する場合の特別な点は? 'private final object lock1 = new Object();'と 'private final Object lock2 = new Object();'を使うと、同じ効果が得られます。ではない? –

+0

私の答えをよく読んでください。ロックは*クラス*ではなく*オブジェクト*である。クラスインスタンスを使用する必要はありません。privateオブジェクトlock3 = new Object()は同じことを行います。単一のメソッドをロックする場合は、メソッドに対して異なるロックを使用します。メソッドのグループを完全にロックする場合は、複数のメソッドに対して1つのロックを使用します。あなたのユースケース、コードで解決したい問題にのみ依存します。 –

関連する問題