7

私はこれら2つの説明について非常に混乱しています:

  1. 「wait メソッドは呼び出しスレッドをブロックし、モニター ロックを放棄します」
  2. 「notify メソッドは 1 つの待機スレッドのブロックを解除しますが、モニター ロックを放棄しません」

ここに私の質問があります:

  1. Java の各オブジェクトにロックがあることは知っていますが、「モニター ロック」とはどういう意味ですか? オブジェクトのロックと同じですか?

  2. なぜ通知メソッドはモニターロックを放棄する必要があるのですか?

  3. 次のコードでオブジェクトを待機させようとすると:

    class simpleTask extends Thread
    {
        int waitingTime;
    
        public simpleTask(int waitingTime)
        {
            this.waitingTime = waitingTime;
        }
    
        public void run()
        {
            synchronized(this) // this is a reference of current object
            {
            try {
                this.wait(waitingTime);
            } catch (InterruptedException e) {
            // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    

上記の最初の説明のように、現在のオブジェクトが synchronized キーワードによってブロックされ、その後 wait メソッドがロックを解放するということですか?

4

3 に答える 3

7

Javaの各オブジェクトにロックがあることは知っていますが、「モニターロック」とはどういう意味ですか?オブジェクトのロックと同じですか?

はい、同じです。これらは、オブジェクトの「ミューテックス」およびオブジェクトの「プリミティブロック」と呼ばれることもあります。(しかし、誰かLockが話しているとき、彼らはこのJavaインターフェースについて話している...これはのロックメカニズムです。)

通知メソッドがモニターロックを放棄する必要があるのはなぜですか?

notifyメソッドはロックを放棄しません。notify呼び出しが戻った後、ロックを放棄する(つまり、同期ブロックを離れるか、同期メソッドから戻る)のはコードの責任です。

なぜそれが必要なのですか?(呼び出しで)そのロックを現在待機している他のスレッドは、呼び出しが完了wait(...)する前にそのロックを再取得する必要があるためです。wait

なぜ彼らはこのようにデザインしたのですnotifywait?条件変数を実装するために使用できるようにします。

上記の最初の説明のように、それは現在のオブジェクトが同期されたキーワードによってブロックされ、次にwaitメソッドがロックを解放することを意味しますか?

それは正しいです。スレッドがsomeObject.wait()そのロックを呼び出すと、ロックsomeObjectが解除されます...そして、wait()呼び出しが戻る前に(同じスレッドによって)再取得されます。もちろん、その間に他のスレッドによってロックが複数回取得および解放されたsomeObject 可能性があります。重要なのは、戻ったときに、呼び出したスレッドがロックを持っているということです。waitwait

于 2012-01-01T07:54:04.320 に答える
0
  1. はい、モニターのロックはオブジェクトのロックと同じです。もしそうならsynchronized (object)、それはロックです。

  2. あなたの例では、現在のオブジェクトは待機中にロックを放棄し、wait()呼び出しはロックを放棄します。別のスレッドでnotify()は、オブジェクトをウェイクアップするために呼び出され、 wait()呼び出しが戻ると、再びロックを保持します。

于 2012-01-01T07:34:04.350 に答える
0

モニターは、同期構造の一種です。

待機がロックを放棄する理由は、他のスレッドがロックを取得できるようにするためです (待機する可能性のある他のスレッドなど)。また、競合状態を防ぐために、スレッドを解放する前に、他のスレッドを目覚めさせているスレッドがロックするのが通常です。

これについて詳しくは、条件変数 (condvars) を調べる必要があります。

于 2012-01-01T07:34:26.673 に答える