ealeon:
private Object x = new Object();
public void doA() {
synchronized(x){
x = new Object();
//do something
}
}
public void doB() {
synchronized(x) {
//do something
}
}
言うことができますdoA()
し、doB()
同時に呼ばれていましたが、doA()
最初に進行しています。Bをするまでブロックされますので、doA()
完成されました
これは、場合も同様ですdoA()
修正は中のX x = new x
コール?または、この行の後x = new x
でdoA()
doB()
はもはやので、ブロックされませんx
変わりましたか?
Kröw:
何が起こるかというと、実際にどのように迅速に依存するdoA()
実行されます:
場合doA()
の値に変更x
する前にdoB()
到達し、その同期ブロックを、その後doB()
にロックする新しいことをオブジェクトdoA()
作成。
場合はdoB()
迅速で、synchronized(x)
前の部分が評価されますdoA()
の値を変更することができx
、その後doB()
になるまで待たなければならないdoA()
のsynchronized
ブロックが終了します。
説明
Javaはになるたびにsynchronized(x)
、いずれかの方法でコードは、変数を評価x
し、その変数には、Javaにオブジェクトを提供します。Javaのように、そのオブジェクトにロックされ、そのオブジェクトのロック、滞在しようとします。それとも、そのオブジェクトのロックがすでにありますならば、それは離れて行くためにロックを待機します。(Javaが到達するたびにsynchronized(x)
コードを使用すると、後で喜ばとして変数を変更することができますが、ロックとロックがまだチェックし、変数の前の値に起こるので、それは、変数自体変数と無視忘れの値をとります。)