2011-10-05 11 views
7

私は同じファイルに以下のプログラムを持っています。 run()メソッドを同期しました。なぜ複数のスレッドを同時に実行できる同期メソッド?

class MyThread2 implements Runnable { 
    Thread t; 

    MyThread2(String s) { 
     t=new Thread(this,s); 
     t.start(); 
    } 

    public synchronized void run() { 
     for (int i=0;i<3;i++) { 
      System.out.println("Thread name : "+ Thread.currentThread).getName()); 
      try { 
       t.sleep(1000); 
      } 
      catch (InterruptedException e) { 
       e.getMessage(); 
      } 
     } 
    } 
} 

class TestSync { 
    public static void main(String[] args) { 
     MyThread2 m1=new MyThread2("My Thread 1"); 
     c.fun(); 
    } 
} 

class c { 
    static void fun() { 
     MyThread2 m1=new MyThread2("My Thread 4"); 
    } 
} 

出力は、私の質問は、なぜ「マイスレッド1」と並行して「マイスレッド4」スレッドのアクセスの両方を可能にする方法を同期化されている

Thread name : My Thread 1 
Thread name : My Thread 4 
Thread name : My Thread 4 
Thread name : My Thread 1 
Thread name : My Thread 1 
Thread name : My Thread 4 

のですか?

+2

あなたが投稿コード少なくとも一つの構文がありますエラーであり、実際には読みにくいです。実際のコードを投稿して読みやすいようにしてください。 – Mat

+0

誤って考えると、メソッドをロックしている代わりに、インスタンスをロックするメソッドがあります。我々は唯一のクラスのインスタンスと複数のスレッドがある場合はその答え –

答えて

27

​​メソッドは、インスタンス・レベルで動作します。クラスの各インスタンスは独自のロックを取得します。ロックは、インスタンスの​​メソッドが入力されるたびに取得されます。これにより、同じインスタンス上で​​メソッドを呼び出す複数のスレッドが、同じインスタンス上で異なる​​メソッドが呼び出されないようにすることに注意してください)。あなたは、クラスのインスタンスを2つ持っているので

は今、各インスタンスは独自のロックを取得します。それ自身のインスタンス上で同時に動作する2つのスレッドを同時に防ぐことはできません。あなたはこれを防ぎたいならば

は、あなたがobjがあなたのクラスの両方のインスタンスで共有いくつかのオブジェクトになりrun()、内部のsynchronized(obj)ブロックを持つことができます:

class MyThread2 implements Runnable { 
    private static final Object lock = new Object(); 
    ... 
    public void run() { 
    synchronized(lock) { 
     ... 
    } 
    } 
} 
+0

おかげで、同時にいくつかの 'synchronized'メソッドを実行することが可能にあるのでしょうか? – user980089

+0

ため – Sajad

+0

@ssss:確かに: '静的'と '非静的'、 'ロックされた'ブロックを異なるロックなどで使用する。詳しい情報が必要な場合は、新しい質問を投稿してください。 – NPE