0

同期化とマルチスレッド化は初めてです。なぜこのコードがオブジェクト b をロックしないのか答えてください。

public class Tetsclass {

    public static void main(String[] args) {
        B b = new B();
        A a = new A(b);
        A2 a2 = new A2(b);
        Thread t1= new Thread(a);
        Thread t2= new Thread(a2);
        t1.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        t2.start();
    }
}
class B {
    public synchronized void waitfor() {        
        synchronized (B.class) {
            System.out.println("Lock aquired  on "+System.currentTimeMillis());
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {      
                e.printStackTrace();
            }
            System.out.println("Lock released");
        }

    }
    public void readObject() {
        System.out.println("readobject by thread==="+Thread.currentThread().getName()+" on "+System.currentTimeMillis());

    }
}
class A2 implements Runnable {

    B b=null;
    public A2(B b) {
        this.b = b;
    }

    @Override
    public void run() {     
        b.readObject();     
    }
}
class A implements Runnable {

    B b=null;
    public A(B b) {
        this.b = b;
    }
    @Override
    public void run() {             
        b.waitfor();                
    }
}

私は出力を期待していました:

Lock aquired  on 1380016080337
Lock released
readobject by thread===Thread-1 on 1380016082337

しかし、出力は次のとおりです。

Lock aquired  on 1380016080337
readobject by thread===Thread-1 on 1380016082337
Lock released
4

4 に答える 4

2

期待どおりの動作です。これがタイムラインで起こることです

a- wait を呼び出します (ロックを解除する前に 5 秒間スリープします) a2- read メッセージを出力する read を呼び出します。

          t          t+dt                                                 t+dt+5
 ---------|-----------|--------------------------------|--------------------------|----------
      [a starts] [print(lock acquired)]             [sleeps(5)]           [print(lock released)]
                            t+2
 ----------------------------|--------------|--------------------------|--------------
                         [a2 starts]   [print(read message)]

あなたの中にいかなる種類のロックもありませんreadObject()

于 2013-09-24T10:24:06.367 に答える
0

readObject()ロックを取得する必要がないため、他のスレッドがロックを解放するのを待ちません。この混乱は、テストクラスに参加したために発生した可能性がありThread.sleep(2000)ます。

それをに変更してThread.sleep(10000)、出力を確認してください。あなたの望む結果が得られます。

最初のケースでは、A2スレッドは開始後2 秒間A待機し、それ以上遅延することなく実行されますが、ロックを取得したときに5 秒間A保留されます。

2 番目のケースでは、スレッドは開始後10A2秒間待機し、その10 秒以内にスレッドが開始され、 5 秒間スリープしてロックが解除されます。その後、スレッドは遅延なく実行されます。AAA2

于 2013-09-24T10:23:52.690 に答える