2012-02-11 6 views

答えて

4

は、このオブジェクトのモニターで待機中のスレッドを1つ再開します。 このオブジェクトを待機しているスレッドがある場合は、そのうちの1つが になるように選択されます。 選択は任意であり、 実装の裁量で発生します。スレッドは、waitメソッドの を呼び出して、オブジェクトのモニタを待機します。

あなたがsynchronized(obj){}を使用するのであれば、あなたは基本的にスレッドがobjのロックを取得しますれている制御することはできません、あなたはどんな仮定をすることはできません。それはスケジューラに依存します。

公正性が必要な場合(つまり、ロックを取得する次のスレッドがキュー内の最初のスレッドである場合)、ReentrantLockを見てください。フェアネスを強制することを指定するブールフラグがあります。

+0

ありがとうございます。また、同期されたブロック(obj)ブロックがwait()も呼び出すようですが、同期したブロックまたはメソッドの前、中、後に実行されるアクションのチェーンを概説できますか? – itsraja

+0

どういう意味ですか?コードで相互排他を保証するために使用されるアルゴリズムは?またはスケジューリングアルゴリズム? 前者については概念的には、Petersonのアルゴリズム(https://en.wikipedia.org/wiki/Peterson's_algorithm)を見てください。 後者については、ここで説明します:http://stackoverflow.com/questions/2816011/what-is-the-jvm-scheduling-algorithm –

+0

ありがとう。私はJavaのメソッドの面で相互排除を意味しました。 wait()、notify()...のように、これらの関数呼び出しのシーケンスが2つのスレッドが1つのオブジェクトを試してシミュレートされているのを見てうれしく思います。これは、1人の女の子を提案している2人(またはそれ以上)の少年に似ています。彼らはそれをwedlockと呼ぶ;) – itsraja

0

このクラスのコンストラクタは、オプションの公平性パラメータを受け付けます。競合状態でtrueに設定された場合、ロックは最長待機スレッドへのアクセスを許可します。それ以外の場合、このロックは特定のアクセス順序を保証しません。

FIFO(先入れ先出し)が使用されている場合は、FIFO(先入れ先出し)が使用されます。そうでない場合は、私の観測からランダムです。 Java documentation for notify()によると

+0

ReentrantLockを使用していると仮定しています。「同じオブジェクトのロックを競合するスレッド」としか言えません。オブジェクトIMHO –

関連する問題