2016-06-01 6 views
0

私はちょうどいくつかのコードを読んで、ローカルオブジェクトを同期させたコードがあることに気付きました。新しいローカルオブジェクトを作成してから何を意味するのかを教えてもらえますか?なぜそれをロックするのですか?私たちは応答を受信したときにローカルオブジェクトと同期

list queue; 
... 

public send() 
{ 
    entry = waitEntry(); 
    //add this object into the list 
    queue.add(entry); 
    ... 
    synchronized(entry) 
    { 
     //do some sth 
     entry.wait(); 
    } 
} 

はその後、ご覧のとおり

public receive() 
{ 
    entry = list.get() <-- get the object we have sent before 
    synchronized(entry) 
    { 
     entry.notify() 
    } 
} 

このオブジェクトのロックを解除し、私はすでに私はそれが再び()メソッドを受け取るロックすることができますどのように、前に「エントリー」をロック?

ありがとうございました。

+0

に関する記事を参照してください。これらの方法は2つのスレッドに分かれています。 1はjavaからcに送信され、もう1つはcからjavaに通知されます。 – dinhha471

+0

これは、JavaからJavaにもっとよく似ています。待機中のスレッドがスリープ状態になるので、 'wait()'は時間のロックを解除します。目が覚めたら再びロックします。 – zapl

+0

これはローカルオブジェクトではありません。 – Galik

答えて

0

同じリソースにアクセスする複数の実行スレッドがある場合、いくつかの並行性の問題があります。例では、最初のスレッドがそのエントリをキューに追加し、次にこのスレッドは、このリソースに対するアクション。 2つのスレッドが同時に実行されるため、receiveメソッドは、誤った状態(ressourceでsendメソッドが実行される前)でエントリressourceを読み取る可能性があります。

これは私が理解する方法ですが、私は間違っている可能性があります。 この種の問題の詳細については、concurrency

関連する問題