なぜですか wait
, notify
そして notifyAll
に配置されたメソッド Object
、別のクラスではありませんか?
注意してください、この質問はそれらをに移動することではありません Thread
クラスは、私はちょうど彼らがなぜごみが出るのだろうか? Object
新しいものではない Monitor
クラス。
そのアイデアには次のような欠点があります。
- 私たちは他の目的のフィールドをモニタとして使うことはできません。しかしこれはモジュール性の原則と一致するようです。
- 次のように、同期化されたメソッドは生成された隠しフィールドを使ったハックを必要とします(クロージャのように)
this
そして<MyClass>.class
無効なモニターになります。
それで、私たちは少しの煩わしさですべてのオブジェクトから5つのメソッドを取り除くことができます。か否か?
回答:
回答№1の場合は7本当の答えはそれが間違いだったということです。 Condition
これはあなたが期待していることと全く同じです。 (オブジェクトなので、誤って起動してしまう可能性があります。 wait()
その代わりに await()
、陽気な結果で...)
既にリストしたもの以外に、モニターをすべての単一オブジェクトに結び付けると、Javaに真に不変のオブジェクトを含めることも不可能になります。
だからあなたはこれを行うことができます例えば:
class A {
void foo() {
synchronized((Integer)42) {
...
}
}
}
class B {
void foo() {
synchronized((Integer)42) {
...
}
}
}
と同じ箱入り整数を返す 42
オブジェクトが問題になることがないように毎回不変でした。しかし、それは変わりやすい状態を持っているわけではありません。モニタ、この種の同期を可能にすることです。独立しています。
回答№2の場合は1
この利点の1つは、冗長なモニタを作成せずに参照を同期することができるということです。
synchronized (myList) {
myList.add(0);
}
対
private final Object mySpecialMonitor = new Object();
syncronized(mySpecialMonitor) {
myList.add(0);
}
すべての同期が別のクラスにある場合は機能しません。
回答№3の場合は0
すべてのオブジェクトがモニターとして機能できるからです。
回答№4の場合は0
1)待って通知するだけでは通常の方法ではない同期ユーティリティは、Javaにおける2つのスレッド間の通信メカニズムです。そして、このメカニズムがsynchronizedのようなjavaキーワードを介して利用できない場合、Objectクラスはそれらをすべてのオブジェクトに対して利用可能にする正しい場所です。同期と待機通知は2つの異なる分野であることを忘れないでください。それらが同じであること、または関連していることを混同しないでください。同期とは、待機と通知が2つのスレッド間の通信メカニズムであり、相互排他を提供し、競合状態のようなJavaクラスのスレッドセーフを確保することです。
2)ロックはオブジェクト単位で利用可能になります。これは、waitおよびnotifyがThreadクラスではなくObjectクラスで宣言されるもう1つの理由です。
3)Javaでの重要なセクションに入るためにコード、スレッドはロックを必要とし、ロックを待つこのアナロジーは、Javaのスレッドではなくオブジェクトクラスで待機して通知することに適しています。
refを使って: http://javarevisited.blogspot.in/2012/02/why-wait-notify-and-notifyall-is.html