2012-02-29 2 views
0

これは簡単な質問かもしれませんが、それでも私の問題です。私はtaskというメソッドを持つクラスを持っています。このクラスのこのメソッドを一度に実行できます。私はこれをこのように実装していますし、正しい方法で行っていますか?メソッドが一度に1つのインスタンスを使用するようにする方法

class A{ 

public void task(){ 
    synchronized(A.this){ 
    //method stuff 
    } 
} 

} 

class B{ 
    public static void main(String a[]){ 
    new A().task(); 
    } 
} 

class C{ 
    public static void main(String a[]){ 
    new A().task(); 
    } 
} 

B場合taskを開始し、それがCを完了する前にも、私はB完了するまで待機するCするタスクになりました。 これまでのところ動作しているようですが、これが正しい方法であることを知りたいのですが、

ありがとうございます。

+0

A.これをA.classに変更しましたが、BとCの両方が同時にタスクにアクセスします。 – sampathpremarathna

答えて

3

一度に1つのスレッドだけが特定のインスタンスでtask()を実行することを保証しますが、別のインスタンスでも同時にtask()を実行することができます。あなたは(擬似コードで)これをしなかった場合には、次のとおりです。各スレッドがAの個別のインスタンスを作成します

Thread t1 = new A().task(); 
Thread t2 = new A().task(); 
t1.start(); 
t2.start(); 

それ以来、彼らはそれぞれ同時にtask()を実行できるようになります。

あなたはstaticフィールド(またはA.class)で同期する必要がある、またはtask()静的、同期メソッド(Classオブジェクトのオフに基づいた場合の​​ロック)します。

2

あなたの場合、そのインスタンスはB.main()を実行しているスレッドとC.main()を実行しているスレッドの両方が、したがって、他のインスタンスによって既にアクセスされている場合でも、そのうちの1人はpublic void task()にアクセスできます。

あなただけ一度に一つのスレッドがそのタスクのメソッドにアクセスできることを確認するには、あなたはこのようにそれを行うことができます。

class A{ 
     private static final Object myLock = new Object(); 

     public void task() { 
      synchronized(myLock) { 
       //method stuff 
      } 
     } 
    } 

またLocksを見ている可能性があります。

関連する問題